【二分匹配】【匈牙利算法】

http://acm.hdu.edu.cn/showproblem.php?pid=2063

过山车

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 27568    Accepted Submission(s): 11900

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<cstring>
 3 #include<iostream>
 4 #include<vector>
 5 using namespace std;
 6 vector<int>qaq[505];
 7 int used[505],vis[505];
 8 bool find(int x)
 9 {
10     for(int i = 0 ; i < qaq[x].size() ; i++)
11     {
12         if(!used[qaq[x][i]])
13         {
14             used[qaq[x][i]]=1;
15             if(!vis[qaq[x][i]]||find(vis[qaq[x][i]]))
16             {
17                 vis[qaq[x][i]]=x;
18                 return 1;
19             }
20         }
21     }
22     return 0;
23 }
24 int main()
25 {
26     int n,m,k;
27     scanf("%d",&k);
28     while(k)
29     {
30         scanf("%d%d",&n,&m);
31         memset(vis,0,sizeof(vis));
32         while(k--)
33         {
34             int a,b;
35             scanf("%d%d",&a,&b);
36             qaq[a].push_back(b);
37             //qaq[b].push_back(a);
38         }
39         int sum=0;
40         for(int i = 1 ; i <= n ; i++)
41         {
42             memset(used,0,sizeof(used));
43             if(find(i))sum++;
44         }
45         cout << sum << endl;
46         for(int i = 0 ; i < 505 ; i++)
47         {
48             qaq[i].clear();
49         }
50         scanf("%d",&k);
51     }
52     return 0; 
53 }

 

posted @ 2018-05-10 22:35  MekakuCityActor  阅读(140)  评论(0编辑  收藏  举报