您的位置:首页 > 其它

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

2015-11-03 22:14 267 查看
二分图最大匹配有两种算法,最大流和匈牙利算法(又叫增广路算法)。

增广路算法的核心就是不断地找增广路,将增广路上的非匹配边变为匹配边,匹配边变为非匹配边,直到没有增广路。

下面是代码:

#include<iostream>
#include<cstring>
using namespace std;

const int maxn = 1001;
const int maxm = 1001;

bool y[maxn],g[maxn][maxm];
int link[maxn];

int n1,n2,m,ans = 0;

void init()
{
cin >> n1 >> n2 >> m;
memset(link,-1,sizeof(link));
memset(g,0,sizeof(g));
for(int i = 0;i < m; i++ )
{
int u,v;
cin >> u >> v;
g[u][v] = 1;
}
}
bool find(int v)
{
for(int i = 0;i < n2; i++ )
if(g[v][i]&&!y[i])
{
y[i] = true;
if(link[i] = -1||find(link[i]))
{
link[i] = v;
return true;
}
}
return false;

}

int main()
{
init();
for(int i = 0;i < n1; i++ )
for(int j = 0;j < n2; j++ )
if(g[i][j]&&link[j] == -1)
{
link[j] = i;
ans++;
}
for(int i = 0;i < n1; i++ )
{
memset(y,0,sizeof(y));
if(find(i))ans++;
}
cout << ans;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: