您的位置:首页 > 其它

二分图最大匹配 匈牙利算法模板

2011-12-04 00:00 274 查看
二分图最大匹配问题的匈牙利算法:

#include<iostream>
using namespace std;
const int Max = 405;

int n, m; // 二分图中x和y中点的数目
int link[Max]; // link[x]记录当前与y节点相连的x的节点。
bool map[Max][Max], vis[Max]; // map[i][j]记录连接x和y的边,如果i和j之间有边则为1,否则为0。

bool dfs(int u){ // dfs实现,u表示现在在寻求匹配y的点x。
for(int i = 1; i <= m; i ++)
if(!vis[i] && map[u][i]){
vis[i] = true;
if(link[i] == -1 || dfs(link[i])){ // 条件:点i还没匹配,或者link[i]找到新的匹配。
link[i] = u;
return true;
}
}
return false;
}

int MaxMatch(){

int i,num = 0;

memset(link, -1, sizeof(link));

for(i = 1;i <= n; i ++){

memset(vis, 0, sizeof(vis));

if(bfs(i)) num++;

}

return num;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: