HDOJ2063过山车
#include<stdio.h>
#include<string.h>
#define MAX 1000
int k,m,n,j,match;
int adjl[MAX][MAX];
int mat[MAX];
bool used[MAX];
bool crosspath(int k)
{
for (int i=1;i<=n;i++)//每个扫描
{
if (adjl[k][i]==true&&used[i]==false)//有联系但没标记过
{
used[i]=true;
if (mat[i]==0 || crosspath(mat[i]))//未标记或者还有其他联系,递归
{
mat[i]=k;
return true;
}
}
}
return false;
}
void hungary()
{
for (int i=1;i<=m;i++)
{
memset(used,0,sizeof(used));//每次要清空
if (crosspath(i))
match++;
}
}
int main()
{
int i,j;
while(scanf("%d",&k)&&k)
{
scanf("%d%d",&m,&n);
match=0;
memset(adjl,0,sizeof(adjl));
memset(mat,0,sizeof(mat));
for(i=1;i<=k;i++)
{
int a,b;
scanf("%d%d",&a,&b);
adjl[a][b]=1;
}
hungary();
printf("%d\n",match);
}
return 0;
}