不断寻找增广路,每找到一条增广路,匹配数加1
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int m,bn,gn;
vector<int> vec[510];
bool b[510]; //记录v2的点是否被访问过
int lk[510]; //记录v2匹配的点
bool find(int cur)
{
for(vector<int>::iterator it=vec[cur].begin();it!=vec[cur].end();it++)
{
if(b[*it]) continue;
b[*it]=1;
if(!lk[*it]||find(lk[*it]))
{
lk[*it]=cur;
return 1;
}
}
return 0;
}
int main()
{
while(scanf(" %d",&m),m)
{
memset(lk,0,sizeof(lk));
scanf(" %d %d",&gn,&bn);
for(int i=1;i<=gn;++i)
vec[i].clear();
int bi,gi;
for(int i=0;i<m;++i)
{
scanf(" %d %d",&gi,&bi);
vec[gi].push_back(bi);
}
int ans=0;
for(int i=1;i<=gn;++i)
{
memset(b,0,sizeof(b));
if(find(i)) ++ans;
}
printf("%d\n",ans);
}
}