二分图最大匹配之匈牙利算法
二分图也是二部图,即可以将一个图分为两部分。
用男女举例,男生与女生有暧昧关系,同性之间是不存在暧昧的(同性才是真爱,异性只为传宗接代),则他们之间存在一条边,那么我们可以将男生,女生分开,男生在左边,女生在右边
我们可以发现在左边的男生是没有边相连的,右边的女生也是,他们只与对面的异性存在边,那么这就是一个二分图。
至于匹配问题也很好理解,这里可以看成夫妻关系,一个男生可以有几个暧昧的异性,但是只有一位妻子,女生也是如此;一对夫妻即一组匹配
那么在给出的一个二分图中,求最大匹配就是最多存在几对夫妻。
求二分图最大匹配这里介绍匈牙利算法:
强推这位博主讲的匈牙利 :https://blog.csdn.net/dark_scope/article/details/8880547
给出一道洛谷的模板题:P3386 【模板】二分图匹配
这里给出我的代码:
1 /* 2 二分图最大匹配模板 3 czq 4 */ 5 6 #include <cstdio> 7 #include <cstring> 8 #include <iostream> 9 using namespace std; 10 const int N = 1e3 + 10; 11 12 int n, m, e; 13 int edges[N][N]; 14 int vis[N], rec[N]; 15 //rec记录配对情况 16 17 inline bool match(int now) 18 { 19 for(int i = 1; i <= m; i++) 20 { 21 if(edges[now][i] == 1 && vis[i] == 0) 22 { 23 vis[i] = 1; 24 if(rec[i] == 0 || match(rec[i])) 25 { 26 rec[i] = now; 27 return true; 28 } 29 } 30 } 31 return false; 32 } 33 34 int main() 35 { 36 memset(rec, 0, sizeof(rec)); 37 memset(edges, 0, sizeof(edges)); 38 cin >> n >> m >> e; 39 for(int i = 1; i <= e; i++) 40 { 41 int u, v; 42 cin >> u >> v; 43 edges[u][v] = 1; 44 } 45 46 int ans = 0; 47 48 for(int i = 1; i <= n; i++) 49 { 50 memset(vis, 0, sizeof(vis)); 51 if(match(i)) ans++; 52 } 53 54 cout << ans << endl; 55 56 return 0; 57 }