匈牙利算法:http://blog.csdn.net/dark_scope/article/details/8880547
代码:
#include<cstdio> #include<cstring> using namespace std; const int N = 505; bool map[N][N],used[N]; int pre[N]; int m,n,k; int find(int cur)//当前女生 { for(int i=1;i<=n;++i) { if(map[cur][i]&&!used[i]) { used[i]=true; if(!pre[i]||find(pre[i]))//pre[i]表示i号男生所属的女生 { pre[i]=cur; return 1; } } } return 0; } int main() { int girl,boy; while(scanf("%d",&k),k){ scanf("%d%d",&m,&n); memset(pre,0,sizeof(pre)); memset(map,false,sizeof(map)); while(k--){ scanf("%d%d",&girl,&boy); map[girl][boy]=true; } int sum=0; for(int i=1;i<=m;++i){ memset(used,false,sizeof(used));//每次重置标记数组 sum+=find(i); } printf("%d\n",sum); } return 0; }