您的位置:首页 > 其它

匈牙利算法(二分图匹配)模板

2015-08-21 20:52 253 查看
在复杂度允许的范围下可以用最大流代替匈牙利算法

bool map[maxn][maxm];	//map[x][y]=true表示点x和点y有边相连
bool road[maxm];	 	//road[i]记录点i是否已在当前增广路中,防止死循环
int link[maxm];			//link[i]记录增广路上与i相连的前一个节点的编号,即记录已求出的匹配,简单的说link[i]用于记录匹配集合中的边
bool find(int v)		//find查找从v点出发是否有可增广路
{
int i;
for(i=1; i<=m; i++)	//可用邻接链表,枚举在下半部分图中与v点相关联的点
{
if(map[v][i]&&(!road[i]))	//如果该点不在增广路上
{
road[i]=true;			//把i标记为已讨论,防止死循环
if(link[i]==0||find(link[i]))	//i是未匹配点(未盖点)或者从i的匹配点出发有可增广路
{
link[i]=v;					//修改与i匹配的点为v
return true;				//则从v出发可找到增广路,返回true
}
}
}
return false;	//如果从v出发没有增广路,返回false
}
int main()
{
//read the graph into array map[]	//首先读入图结构到map数组中
for(i=1; i<=n; i++)					//依次从上半部图的点出发,寻找增广路
{
for(j=1; j<=m; j++)road[j]=false;
if(find(i))tot++;				//每找到一条增广路,匹配数加1(最多n个匹配)
}
printf("%d", tot);					//输出最大匹配数
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: