这个题目适合刚刚接触二分图的同学做哦:
给一个题目链接 点击打开链接。
题目大意,有K个男女匹配方式, 输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000
1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。
输出最大的男女匹配对数,匹配方式为,一个男生匹配一个女生;
题目思路:
先让1与能匹配到的男生进行匹配,用一个数组记录与该男生匹配的女生是谁?
如果该男生没有匹配直接匹配,即可。
如果该男生已经被摸个女生匹配,就让该男生匹配女生重新进行匹配。
否则 ,表示该女生匹配不到人。
这个题目是 裸的二分图 直接用模板,
算法是: 匈牙利算法
#include<iostream> #include<string.h> #include<cstdio> using namespace std; const int MM=505; bool adjmat[MM][MM],vis[MM]; int boy_s_girl[MM]; int k,girl,boy; int pipei(int people) //需要进行匹配的女生 { int i; for(i=1;i<=boy;i++) // 男生 { if(adjmat[people][i]&&!vis[i]) // 如果该女生可以与该男生匹配 且该男生未被匹配 { vis[i]=1; if(boy_s_girl[i]==0||pipei(boy_s_girl[i])) // 如果该男生未被匹配 ,或者 // 继续找该男生匹配到女生除他以外的其他男生 { boy_s_girl[i]=people; return 1; } } } return 0; } int main() { int ans; while(scanf("%d",&k)!=EOF&&k) { scanf("%d %d",&girl,&boy); int i; memset(adjmat,0,sizeof(adjmat)); memset(boy_s_girl,0,sizeof(boy_s_girl)); ans=0; for(i=0;i<k;i++) { int a,b; scanf("%d %d",&a,&b); adjmat[a][b]=true; } for(i=1;i<=girl;i++) { memset(vis,0,sizeof(vis)); ans+=pipei(i); } cout<<ans<<endl; } return 0; }