HDU 2063 过山车 (最大匹配,匈牙利算法)

 

题意:中文题目

思路:匈牙利算法解决二分图最大匹配问题。

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=505;
 4 int mapp[N][N]; //矩阵
 5 int girl[N];    //记录该女已分配的男编号
 6 int vis[N];     //标记是否已经尝试为其另分配
 7 int n, a, b, k, m;
 8 
 9 int find(int x)
10 {
11     for(int i=1; i<=m; i++) //扫描所有妹子
12     {
13         if(mapp[x][i]&&!vis[i])  //有暧昧,未尝试为其另分配
14         {
15             vis[i]=1;   //已尝试
16             if( !girl[i] || find(girl[i]) )
17             {
18                 girl[i]=x;
19                 return true;
20             }
21         }
22     }
23     return false;
24 }
25 
26 int hungary()
27 {
28     int cnt=0;
29     for(int i=1; i<=n; i++)
30     {
31         memset(vis,0,sizeof(vis));
32         if(find(i))    cnt++;
33     }
34     return cnt;
35 }
36 
37 int main()
38 {
39     freopen("input.txt", "r", stdin);
40 
41     while(scanf("%d",&k), k)
42     {
43         memset(vis,0,sizeof(vis));
44         memset(mapp,0,sizeof(mapp));
45         memset(girl,0,sizeof(girl));
46         scanf("%d%d",&m,&n);
47 
48         for(int i=0; i<k; i++)  //2分图
49         {
50             scanf("%d%d",&b,&a);
51             mapp[a][b]=1;
52         }
53         printf("%d\n",hungary());
54     }
55     return 0;
56 }
AC代码

 

posted @ 2015-06-30 19:49  xcw0754  阅读(161)  评论(0编辑  收藏  举报