这个题目适合刚刚接触二分图的同学做哦:
给一个题目链接 。
题目大意,有K个男女匹配方式, 输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000
1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。
输出最大的男女匹配对数,匹配方式为,一个男生匹配一个女生;
题目思路:
先让1与能匹配到的男生进行匹配,用一个数组记录与该男生匹配的女生是谁?
如果该男生没有匹配直接匹配,即可。
如果该男生已经被摸个女生匹配,就让该男生匹配女生重新进行匹配。
否则 ,表示该女生匹配不到人。
这个题目是 裸的二分图 直接用模板,
算法是:
#include#include #include 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