您的位置:首页 > 其它

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

2015-02-23 14:09 323 查看
关于算法的讲解,个人觉得这篇博文写得非常好:http://blog.csdn.net/dark_scope/article/details/8880547

我的代码:

#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

#define MAXN 1005

vector<int> g[MAXN];
int n, m, color[MAXN], mm[MAXN];
bool used[MAXN];

bool isBiGraph(int x, int co)
{
bool ret = true;
color[x] = co;
int sz = g[x].size();
for(int i=0; i<sz; ++i)
{
int y = g[x][i];
if(color[y]<0)
{
ret = ret&&isBiGraph(y, co^1);
if(!ret) return ret;
}
else if(color[y]==co)   return false;
}
return ret;
}

bool findm(int x)
{
int sz = g[x].size();
for(int i=0; i<sz; ++i)
{
int y = g[x][i];
if(!used[y])
{
used[y] = true;
if(mm[y]==0 || findm(mm[y]))
{
mm[x] = y;
mm[y] = x;
return true;
}
}
}
return false;
}

void init()
{
for(int i=1; i<=n; ++i) g[i].clear();
memset(color+1, -1, n*sizeof(int));
memset(mm+1, 0, n*sizeof(int));
}

int main()
{
while(scanf("%d%d", &n, &m)!=EOF)
{
init();
while(m--)
{
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
if(isBiGraph(1, 0))
{
int ans = 0;
for(int i=1; i<=n; ++i)
{
if(color[i])
{
memset(used+1, 0, n);
if(findm(i)) ++ans;
}
}
printf("%d\n", ans);
}
else puts("0");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: