过山车

题意 男女匹配,最多组合数

题解 匈牙利算法

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<stdio.h>
 2 #include<string.h>
 3 #define N 1000
 4 int map[N][N],visit[N],mark[N];
 5 int k,n,m;
 6 
 7 bool dfs(int u)//寻找从u出发的对应项出的可增广路
 8 {
 9     for(int i=1;i<=n;i++)//(从邻接表中列举u能关联到顶点j)
10     {
11         if(map[u][i]&&!visit[i])//i不在增广路上
12         {
13             visit[i]=true;//把i加入增广路
14             if(!mark[i]||dfs(mark[i]))//i是未盖点或从i的对应项出发有可增广路 
15             {
16                 mark[i]=u;//修改i的对应项为u
17                 return true;//则从u的对应项出有可增广路,返回true 
18             }
19         }
20     }
21     return false;//则从u的对应项出没有有可增广路,返回false 
22 }
23 
24 int main()
25 {
26     int i,j,a,b;
27     while(~scanf("%d",&k)&&k)
28     {
29         scanf("%d %d",&m,&n);
30         for(i=1;i<=m;i++)
31             for(j=1;j<=n;j++)
32                 map[i][j]=false;
33             for(i=1;i<=k;i++)
34             {
35                 scanf("%d %d",&a,&b);
36                 map[a][b]=true;
37             }
38             int ans=0;
39             memset(mark,0,sizeof(mark));
40             for(i=1;i<=m;i++)
41             {
42                 memset(visit,0,sizeof(visit));
43                 if(dfs(i))
44                     ans++;//匹配数++ 
45             }
46             printf("%d\n",ans);
47     }
48     return 0;
49 }

 

posted @ 2015-02-07 12:36  江豚  阅读(182)  评论(0编辑  收藏  举报