题解:利用dfs或者bfs不停找到增广路,然后用一个link[]数组记录匹配。如果link[i]没有在原匹配中,就更新匹配并加入其中,当此次增广路完成并更新完匹配,最大匹配值ans加1。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cctype>
#include<vector>
using namespace std;
int v1,v2,ans;
int a[1001][1001];
int vit[1001];
int link[1001];
bool dfs(int x)
{
for(int y=1;y<=v2;y++)
{
if(a[x][y]&&!vit[y])
{
vit[y]=1;
if(link[y]==0||dfs(link[y]))//link[y]==0: y不属于前一个匹配M。
{
link[y]=x;
return true;
}
}
}
return false;
}
void Search()
{
for(int i=1;i<=v1;i++)
{
memset(vit,0,sizeof(vit));
if(dfs(i))
ans++;
}
return ;
}
int main()
{
int k,m,n;
while(cin>>k)
{
if(k==0)
break;
cin>>n>>m;
v1=n,v2=m;
memset(a,0,sizeof(a));
memset(link,0,sizeof(link));
for(int i=1;i<=k;i++)
{
int x,y;
cin>>x>>y;
a[x][y]=1;
}
ans=0;
Search();
cout<<ans<<endl;
}
return 0;
}