hdu2063 过山车(匈牙利)模板

过山车

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


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
 
邻接矩阵:
View Code
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #define MAXN 510
 5 
 6 using namespace std;
 7 
 8 int map[MAXN][MAXN],p[MAXN],used[MAXN];
 9 int n,m;
10 
11 bool dfs(int u)
12 {
13     int v;
14     for(v=1;v<=m;v++)
15     {
16         if(map[u][v]&&!used[v])
17         {
18             used[v]=true;
19             if(p[v]==-1||dfs(p[v]))
20             {
21                 p[v]=u;
22                 return true;
23             }
24         }
25     }
26     return false;
27 }
28 
29 int hungary()
30 {
31     memset(p,-1,sizeof(p));
32     int u,ans=0;
33     for(u=1;u<=n;u++)
34     {
35         memset(used,0,sizeof(used));
36         if(dfs(u)) ans++;
37     }
38     return ans;
39 }
40 
41 int main()
42 {
43     int k,i,u,v,ans;
44     while(scanf("%d",&k)==1&&k)
45     {
46         scanf("%d%d",&n,&m);
47         memset(map,0,sizeof(map));
48         for(i=0;i<k;i++)
49         {
50             scanf("%d%d",&u,&v);
51             map[u][v]=1;
52         }
53         ans=hungary();
54         printf("%d\n",ans);
55     }
56     return 0;
57 }

 

 
邻接表:
View Code
 1 #include<iostream>
 2 #include<vector>
 3 #include<cstring>
 4 #include<cstdio>
 5 #define MAXN 510
 6 
 7 using namespace std;
 8 
 9 vector<int>e[MAXN];
10 int p[MAXN],n,m;
11 bool used[MAXN];
12 
13 bool dfs(int u)
14 {
15     int v;
16     vector<int>::iterator it;
17     for(it=e[u].begin();it!=e[u].end();it++)
18     {
19         v=*it;
20         if(!used[v])
21         {
22             used[v]=true;
23             if(p[v]==-1||dfs(p[v]))
24             {
25                 p[v]=u;
26                 return true;
27             }
28         }
29     }
30     return false;
31 }
32 
33 int hungray()
34 {
35     int u,ans=0;
36     memset(p,-1,sizeof(p));
37     for(u=1;u<=n;u++)
38     {
39         memset(used,false,sizeof(used));
40         if(dfs(u)) ans++;
41     }
42     return ans;
43 }
44 
45 int main()
46 {
47     int i,k,u,v;
48     while(scanf("%d",&k)==1&&k)
49     {
50         scanf("%d%d",&n,&m);
51         for(i=1;i<=n;i++) e[i].clear();
52         for(i=1;i<=k;i++)
53         {
54             scanf("%d%d",&u,&v);
55             e[u].push_back(v); //有向边
56         }
57         printf("%d\n",hungray());
58     }
59 }

 

posted @ 2012-07-24 21:13  mtry  阅读(272)  评论(0)    收藏  举报