6 3 3 1 1 1 2 1 3 2 1 2 3 3 1 0
3
第一次做二分图。。
上个代码
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int map[502][502]; int vis[502]; int pre[502]; int n,m; int find(int x) //二分匹配。(x为girl) { int i; for(i=1;i<=m;i++) //(girl find boy) { if(map[x][i] &&!vis[i]) //这个男生没被找过。 { vis[i]=1; //标记找过 if(pre[i]==-1 ||find(pre[i])) //没被找过 or 找下一个男生 { pre[i]=x; //男生i和女生x匹配,这里很重要,保证这个女生不会和其他男生去匹配。 return 1; } } } return 0; } int main() { int partner,girl,boy; while(scanf("%d",&partner)&&partner) { int i; scanf("%d%d",&n,&m); memset(pre,-1,sizeof(pre)); memset(map,0,sizeof(map)); for(i=0;i<partner;i++) { scanf("%d%d",&girl,&boy); map[girl][boy]=1; //有女生愿意想找boy做partner的赋值为一。 } int ans=0; for(i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); //每次查找时都初始化。 if(find(i)) //girl find boy。 ans++; } printf("%d\n",ans); } return 0; }
原文地址:http://blog.csdn.net/sky_miange/article/details/43742045