过山车
简单的二分匹配题,基本上是模板。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 502
using namespace std;
bool map[N][N],vis[N];
int link[N];
int n,m;
bool dfs(int i)
{
int j,k;
for(j=1; j<=m; j++)
{
if(map[i][j]&&!vis[j])
{
vis[j]=1;
k=link[j];
link[j]=i;
if(k==-1)
return 1;
if(dfs(k))
return 1;
link[j]=k;
}
}
return 0;
}
int main()
{
int i,j,k,l;
int sum=0;
while(~scanf("%d",&k)&&k)
{
scanf("%d%d",&n,&m);
memset(map,0,sizeof(map));
for(i=0; i<k; i++)
{
scanf("%d%d",&j,&l);
map[j][l]=1;
}
sum=0;
memset(link,-1,sizeof(link));
for(i=1; i<=n; i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
sum++;
}
printf("%d\n",sum);
}
return 0;
}