【二部图+基础最大匹配数】过山车

过山车

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结束输入。
 

 

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版本)
 
 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 }
View Code

 

posted @ 2015-08-16 17:50  Wurq  阅读(221)  评论(0编辑  收藏  举报