总感觉网上的一些模板是错的,自己又把错误的地方进行了改进,主要是匈牙利算法的终止条件要符合。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;
#define maxn 100005
int vis[maxn];
int link[maxn];
vector<int>G[maxn];//存边
int dfs(int s)
{
for(int i=0; i<G[s].size(); i++)
{
int t = G[s][i];
if(!vis[t])
{
vis[t] = 1;
if(link[t] == -1 || dfs(link[t]))
{
link[t] = s;
return 1;
}
}
}
return 0;
}
int max_pipei(int n)
{
int ans = 0;
int k=1;
while(k!=0)//直到没有增广路径为止
{
k=0;
for(int i=1; i<=n; i++)
{
memset(vis, 0, sizeof(vis));
int d=dfs(i);
ans += d;
if(d!=0)
k=1;
}
}
return ans;
}
int main()
{
int ld, rd; //左半边的点数, 右半边的点数
while(~scanf("%d%d", &ld, &rd))
{
for(int i=0; i<maxn; i++)
G[i].clear();
memset(link, -1, sizeof(link));
int m; //边数
scanf("%d", &m);
for(int i=0; i<m; i++)
{
int u, v;
scanf("%d%d", &u, &v);
//无向边
G[u].push_back(v+ld);
G[v+ld].push_back(u);
}
printf("%d\n", max_pipei(ld));
}
return 0;
}