二分图匹配(匈牙利算法模板)

最大匹配——匈牙利算法

 1 /****************************************************
 2 二分图匹配(匈牙利算法的DFS实现)
 3 INIT:g[][]两边定点划分的情况
 4 CALL:res=hungary();输出最大匹配数
 5 优点:适于稠密图,DFS找增广路快,实现简洁易于理解
 6 时间复杂度:O(VE);
 7 ****************************************************/
 8 #include <iostream>
 9 #include <cstdio>
10 #include <cstring>
11 using namespace std;
12 const int MAXN=1000;
13 int uN, vN;  //u,v数目
14 int g[MAXN][MAXN];//编号是0~n-1的 
15 int match[MAXN];
16 int f[MAXN];
17 
18 bool dfs(int u)
19 {
20     for (int i = 0; i < vN; i++)
21         if (g[u][i] && !f[i])
22         {
23             f[i] = 1;
24             if (match[i] == -1 || dfs(match[i]))
25             {
26                 match[i] = u;
27                 return true;
28             }
29         }
30     return false;
31 }
32 
33 int hungary()
34 {
35     int ans = 0;
36     memset(match, -1, sizeof(match));
37     for (int i = 0; i < uN; i++)
38     {
39          memset(f, 0, sizeof(f));
40         if (dfs(i))
41             ans++;
42     }
43     return ans;
44 }
View Code

相关的题有

HDU 1045

HDU 2063过山车

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 using namespace std;
 6 
 7 #define N 505
 8 
 9 int map[N][N], flag[N];
10 int pre[N];
11 int n, m, num;
12 
13 int dfs(int cur)
14 {
15     for (int i = 1; i <= m ;i++)
16     {
17         if (map[cur][i] && !flag[i])
18         {
19             flag[i] = 1;
20             if (pre[i] == -1 || dfs(pre[i]))
21             {
22                 pre[i] = cur;
23                 return 1;
24             }
25         }
26     }
27     return 0;
28 }
29 
30 int main()
31 {
32     int girl, boy, sum;
33     while (cin >> num && num)
34     {
35         cin >> n >> m;
36         memset(map, 0, sizeof(map));
37         memset(pre, -1, sizeof(pre));
38         for (int i = 0; i < num; i++)
39         {
40             cin >> girl >> boy;
41             map[girl][boy] = 1;
42         }
43         sum = 0;
44         for (int i = 1; i <= n; i++)
45         {
46             memset(flag, 0, sizeof(flag));
47             sum += dfs(i);
48         }
49         cout << sum << endl;
50     }
51     return 0;
52 }
View Code
原文地址:https://www.cnblogs.com/KimKyeYu/p/3175990.html