过山车
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5139 Accepted Submission(s): 2260
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结束输入。
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
Recommend
lcy
注意清零,计算式,路径标记
code:
1 #include <iostream> 2 #include <iomanip> 3 #include <fstream> 4 #include <sstream> 5 #include <algorithm> 6 #include <string> 7 #include <set> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <list> 12 #include <vector> 13 #include <cstdio> 14 #include <cstdlib> 15 #include <cstring> 16 #include <cmath> 17 #include <ctime> 18 #include <ctype.h> 19 using namespace std; 20 21 #define MAXN 1010 22 23 int map[MAXN][MAXN]; 24 int path[MAXN]; 25 int vst[MAXN]; 26 int k,m,n; 27 28 bool dfs(int v) 29 { 30 for(int i=1;i<=n;i++) 31 if(!vst[i]&&map[v][i]) 32 { 33 vst[i]=1; 34 if(path[i]==-1||dfs(path[i])) //注意 35 { 36 path[i]=v; 37 return true; 38 } 39 } 40 return false; 41 } 42 43 int hungary() 44 { 45 int cnt=0; 46 memset(path,-1,sizeof(path)); //注意清零 47 for(int i=1;i<=m;i++) 48 { 49 memset(vst,0,sizeof(vst)); //注意清零 50 if(dfs(i)) 51 cnt++; 52 } 53 return cnt; 54 } 55 56 int main() 57 { 58 int a,b; 59 while(~scanf("%d",&k),k) 60 { 61 scanf("%d%d",&m,&n); 62 memset(map,0,sizeof(map)); //注意清零 63 for(int i=1;i<=k;i++) 64 { 65 scanf("%d%d",&a,&b); 66 map[a][b]=1; 67 } 68 int ans=hungary(); 69 printf("%d\n",ans); 70 } 71 return 0; 72 }