6 3 3 1 1 1 2 1 3 2 1 2 3 3 1 0
3
匈牙利算法。
#include<stdio.h>
#include<string.h>
int map[505][505],vis[505],sign[505];
int k,m,n;
int dfs(int x)
{
int i;
for(i=1;i<=n;i++)
{
if(!vis[i]&&map[x][i])
{
vis[i]=1;
if(!sign[i]||dfs(sign[i]))
{
sign[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int i,a,b;
int sum;
while(~scanf("%d",&k)&&k!=0)
{
scanf("%d%d",&m,&n);
sum=0;
memset(map,0,sizeof(map));
for(i=1;i<=k;i++)
{
scanf("%d%d",&a,&b);
map[a][b]=1;
}
memset(sign,0,sizeof(sign));
for(i=1;i<=m;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
sum++;
}
printf("%d\n",sum);
}
return 0;
}
原文地址:http://blog.csdn.net/hanhai768/article/details/25749053