题目分析:
要想完成此题,需用到了二分图的知识。包括:
1.二分图的基本概念
2.最大匹配的概念
3.增广路径的概念
4.匈牙利算法
1.2.3概念参考资料:点击打开链接
匈牙利算法参考资料:http://wenku.baidu.com/view/d1070024af45b307e8719770.html
解题思路:http://www.cnblogs.com/lyy289065406/archive/2011/07/30/2121730.html
我用C写的:
#include<stdio.h>
int result[501];
int mark[501];
int map[501][501];
int find(int i,int a);
int main()
{
int a,b,x,y,i,j,count;
count=0;
scanf("%d %d",&a,&b);
for(j=0; j<=a; j++)
{
for(i=0; i<=a; i++)
map[j][i]=0;
result[j]=0;
mark[j]=0;
}
for(i=1; i<=b; i++)
{
scanf("%d %d",&x,&y);
map[x][y]=1;
}
for(i=1; i<=a; i++)
{
for(j=0; j<=a; j++)
mark[j]=0;
if(find(i,a))
{
count++;
}
}
printf("%d\n",count);
}
int find(int i,int a)
{
int j;
for(j=1; j<=a; j++)
{
if(map[i][j]==1&&mark[j]==0)
{
mark[j]=1;
if(result[j]==0||find(result[j],a))
{
result[j]=i;
return 1;
}
}
}
return 0;
}