杭电 2063 过山车

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<cstring>
 3 int G[550][550];
 4 int flag[550];
 5 int match[550];                    
 6 int k,m,n;
 7 bool dfs(int u)
 8 {
 9     int v;
10     for(v = 1 ; v <= n ; v++)
11     {
12         if(G[u][v] && !flag[v])
13         {
14             flag[v]=1;                    //标记u选中的男生 
15             if(!match[v] || dfs(match[v]))         
16             {
17                 match[v]=u;                //表示女生v和男生u配对 
18                 return true;
19             }
20         }
21     }
22     return false;
23 }
24 int main()
25 {
26     while(scanf("%d",&k),k)
27     {
28         scanf("%d %d",&m,&n);
29         int i,j;
30         for(i = 1 ; i <= m ; i++)
31         {
32             for(j = 1 ; j <= n ; j++)
33             {
34                 G[i][j]=false;            
35             }
36         }
37         int a,b;
38         for(i = 0 ; i < k ; i++)
39         {
40             scanf("%d %d",&a,&b);
41             G[a][b]=true;                    //表示女生a愿意和男生b在一起 
42         }
43         memset(match,0,sizeof(match));        
44         int ans=0;
45         for(i = 1 ; i <= m ; i++)
46         {
47             memset(flag,0,sizeof(flag));
48             if(dfs(i))
49                 ans++;
50         }
51         printf("%d\n",ans);
52     }
53 }

 

posted @ 2016-08-17 11:03  野小子&  阅读(297)  评论(0编辑  收藏  举报