hdu 2063 过山车 (最大匹配 匈牙利算法模板)

匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。

题目链接:

  http://acm.hdu.edu.cn/showproblem.php?pid=2063

题目大意:

  中文题目,点进去马上知道。

解题思路:

  这道题目就是求最大匹配数目,直接套用匈牙利算法模板,这个算法大概原则就是:有机会上,没有机会创造机会也要上。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 #define maxn 505
 8 int map[maxn][maxn], used[maxn], girl[maxn], n, m;
 9 //map储存匹配关系,used用来标记是否增广过,girl[i]表示girl[i]这个女生已经和i这个男生匹配
10 bool find (int x);
11 int main ()
12 {
13     int k;
14     while (scanf ("%d", &k), k)
15     {
16         scanf ("%d %d", &m, &n);
17         memset (map, 0, sizeof(map));
18         memset (girl, 0, sizeof(girl));
19 
20         while (k --)
21         {
22             int u, v;
23             scanf ("%d %d", &u, &v);
24             map[u][v] = 1;
25         }
26 
27         int sum = 0;
28         for (int i=1; i<=m; i++)
29         {//每个女生匹配,都需要清空标记增广数组
30             memset (used, 0, sizeof(used));
31             if (find (i))
32                 sum ++;
33         }
34         printf ("%d
", sum);
35     }
36     return 0;
37 }
38 
39 bool find (int x)
40 {//dfs增广,寻找x的匹配
41     for (int i=1; i<=n; i++)
42     {
43         if (!used[i] && map[x][i])
44         {//未被增广并且x与i可以匹配
45             used[i] = 1;
46             if (!girl[i] || find(girl[i]))
47             {//i没有和任一个女生匹配或者发现增光路,则匹配成功
48                 girl[i] = x;
49                 return true;
50             }
51         }
52     }
53     return false;
54 }
本文为博主原创文章,未经博主允许不得转载。
原文地址:https://www.cnblogs.com/alihenaixiao/p/4475578.html