二分图最大匹配有两种算法,最大流和匈牙利算法(又叫增广路算法)。
增广路算法的核心就是不断地找增广路,将增广路上的非匹配边变为匹配边,匹配边变为非匹配边,直到没有增广路。
下面是代码:
#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;
}