hdu 2063 过山车

过山车
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8001 Accepted Submission(s): 3509


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


Author
PrincessSnow


Source
RPG专场练习赛


Recommend
lcy

 1 //15MS 1204K 844 B G++ 
 2 /*
 3     
 4     题意: 中文..
 5     
 6     二分匹配:
 7         入门题不用解释了..直接模板吧,
 8     不懂的看看资料 
 9      
10 */
11 #include<stdio.h>
12 #include<string.h>
13 int g[505][505];
14 int match[505];
15 int vis[505];
16 int n,m;
17 int dfs(int u)
18 {
19     for(int i=1;i<=m;i++){
20         if(g[u][i] && !vis[i]){
21             vis[i]=1;
22             if(match[i]==-1 || dfs(match[i])){
23                 match[i]=u;
24                 return 1;
25             }
26         }
27     }
28     return 0;
29 }
30 int hungary()
31 {
32     memset(match,-1,sizeof(match));
33     int cnt=0;
34     for(int i=1;i<=n;i++){
35         memset(vis,0,sizeof(vis));
36         cnt+=dfs(i);
37     }
38     return cnt;
39 }
40 int main(void)
41 {
42     int k;
43     int a,b;
44     while(scanf("%d",&k),k)
45     {
46         memset(g,0,sizeof(g));
47         scanf("%d%d",&n,&m);
48         for(int i=0;i<k;i++){
49             scanf("%d%d",&a,&b);
50             g[a][b]=1;
51         }
52         printf("%d\n",hungary());
53     }
54     return 0;
55 }

posted @ 2013-10-22 08:10  heaventouch  阅读(102)  评论(0编辑  收藏  举报