HDU2063--过山车
过山车
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7110 Accepted Submission(s): 3098
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
最大匹配求组合数
1 #include<cstdio> 2 #include<string> 3 #include<algorithm> 4 #include<iostream> 5 #include<cmath> 6 #include<cstring> 7 using namespace std; 8 9 int link[1001][1001]; 10 int cx[1001]; 11 int cy[1001]; 12 int mk[1001]; 13 14 int m,nx,ny; 15 16 void init() 17 { 18 memset(cx,0xff,sizeof(cx)); 19 memset(cy,0xff,sizeof(cy)); 20 memset(link,0,sizeof(link)); 21 memset(mk,0,sizeof(mk)); 22 } 23 24 int path(int u) 25 { 26 int v; 27 for(v=1;v<=ny;v++) 28 { 29 if(!mk[v]&&link[u][v]) 30 { 31 mk[v]=1; 32 if(cy[v]==-1||path(cy[v])) 33 { 34 cx[u]=v; 35 cy[v]=u; 36 return 1; 37 } 38 } 39 } 40 return false; 41 } 42 43 int maxmatch() 44 { 45 int i; 46 int sum=0; 47 for(i=1;i<=nx;i++) 48 { 49 if(cx[i]==-1) 50 { 51 memset(mk,0,sizeof(mk)); 52 sum+=path(i); 53 } 54 } 55 return sum; 56 } 57 58 int main() 59 { 60 while(scanf("%d",&m)!=EOF) 61 { 62 if(!m)break; 63 init(); 64 scanf("%d%d",&nx,&ny); 65 while(m--) 66 { 67 int u,v; 68 scanf("%d%d",&u,&v); 69 link[u][v]=1; 70 } 71 int ans=maxmatch(); 72 printf("%d\n",ans); 73 } 74 return 0; 75 }