标签:
匈牙利算法是由匈牙利数学家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\n", 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 }
标签:
原文地址:http://www.cnblogs.com/alihenaixiao/p/4475578.html