【二部图+基础最大匹配数】过山车
过山车
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 14272 Accepted Submission(s): 6298
Problem Description
RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner。考虑到经费问题,boss刘决定只让找到partner的人去坐过山车,其他的人,嘿嘿,就站在下面看着吧。聪明的Acmer,你可以帮忙算算最多有多少对组合可以坐上过山车吗?
Input
输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000
1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。
1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。
Output
对于每组数据,输出一个整数,表示可以坐上过山车的最多组合数。
Sample Input
6 3 3
1 1
1 2
1 3
2 1
2 3
3 1
0
Sample Output
3
题目大意很简单,就是问你在二部图中求最大匹配数,今天刚刚学习了匈牙利算法,在理解了算法后自己去实践写了下代码,虽然提交了几次wa,都是忘记初始化惹的祸Orz,Orz,Orz,Orz.....
还有网上虽然有很对讲匈牙利算法的,不过一开始就说了一堆专业术语的,很容易让刚接触的人不好理解,所以最好先理解下匈牙利算法是具体过程如何,才能让我们更好的理解算法,一个不错的介绍匈牙利的算法,不懂的看了也差不多懂了的:
代码:匈牙利算法(DFS版本)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #define MAX 1010 5 using namespace std; 6 struct Edge{int to,next;}ID[MAX*2]; 7 int First[MAX]; 8 int SIGN[MAX];/*记录点是否被标记过*/ 9 int Fa[MAX]; 10 int Top; 11 void Add_E(int x,int y) 12 { 13 ID[Top].to=y; 14 ID[Top].next=First[x]; 15 First[x]=Top++; 16 } 17 void Cread(int N,int M) 18 { 19 for(int i=1;i<=N;i++)First[i]=0; 20 for(int i=1;i<=M;i++)Fa[i]=0;Top=1; 21 } 22 int Find_Rood(int n) 23 { 24 for(int i=First[n];i;i=ID[i].next) 25 { 26 int v=ID[i].to; 27 if(!SIGN[v]) 28 { 29 SIGN[v]=1; 30 if(!Fa[v]||Find_Rood(Fa[v])) 31 { 32 Fa[v]=n; 33 return 1; 34 } 35 } 36 } 37 return 0; 38 39 } 40 int Max_Match(int N) 41 { 42 int Max=0; 43 for(int i=1;i<=N;i++) 44 { 45 memset(SIGN,0,sizeof(SIGN)); 46 if(Find_Rood(i))Max++; 47 } 48 return Max; 49 } 50 int main() 51 { 52 int K,N,M,i,a,b; 53 while(scanf(" %d",&K)!=EOF&&K) 54 { 55 scanf(" %d%d",&N,&M); 56 Cread(N,M); 57 while(K--) 58 { 59 scanf("%d%d",&a,&b); 60 Add_E(a,b); 61 } 62 printf("%d\n",Max_Match(N)); 63 } 64 return 0; 65 }
转载请备注:
**************************************
* 作者: Wurq
* 博客: https://www.cnblogs.com/Wurq/
* Gitee: https://gitee.com/wurq
**************************************
**************************************
* 作者: Wurq
* 博客: https://www.cnblogs.com/Wurq/
* Gitee: https://gitee.com/wurq
**************************************