过山车 HDU 2063 (二分图匹配裸题)

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
 
DFS算法
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define MAXN 510
 5 using namespace std;
 6 int n,m,k;///x,y集合中点的个数
 7 int maps[MAXN][MAXN];///邻接矩阵
 8 int cx[MAXN];///匹配关系,cx[1]=2表示男1和女2约会
 9 int cy[MAXN];
10 int vis[MAXN];///顶点访问状态数组,1访问过,0未访问过
11 int path(int x)///x为任何一个女生
12 {
13     int i;
14     for(i=1; i<=n; i++)///i为男生
15     {
16         if(maps[x][i]&&!vis[i])
17         {
18             vis[i]=1;
19             if(!cx[i]||path(cx[i]))
20             {
21                 cx[i]=x;
22                 cy[x]=i;
23                 return 1;
24             }
25         }
26     }
27     return 0;
28 }
29 int MaxMatch()
30 {
31     int res=0;
32     int i;
33     memset(cy,0,sizeof(cy));
34     memset(cx,0,sizeof(cx));///初始化为0
35     for(i=1; i<=m; i++)
36     {
37         memset(vis,0,sizeof(vis));
38         if(path(i))
39         {
40             res++;
41         }
42     }
43     return res;
44 }
45 int main()
46 {
47     int i;
48     int a,b;
49     while(scanf("%d",&k)!=EOF)
50     {
51         if(k==0)
52         {
53             break;
54         }
55         scanf("%d%d",&m,&n);
56         memset(maps,0,sizeof(maps));
57         for(i=0; i<k; i++)
58         {
59             scanf("%d%d",&a,&b);
60             maps[a][b]=1;
61         }
62         printf("%d\n",MaxMatch());
63     }
64     return 0;
65 }

猜你喜欢

转载自www.cnblogs.com/wkfvawl/p/9839325.html
今日推荐