匈牙利算法 二分图问题(最小顶点覆盖,最小边覆盖,最大独立集)

ADT:

 1 const int maxn = 150; //表示集合x,y中顶点个数的最大值
 2 
 3 int n,m; // n,m分别表示 x,y中顶点个数
 4 bool g[maxn][maxn]; //邻接矩阵,1表示有连接
 5 int cx[maxn];//最大匹配中,与x集合中x[i]匹配的y集合中顶点的索引
 6 int cy[maxn];
 7 
 8 int mk[maxn];//dfs算法中记录顶点访问状态的数据, 0未访问
 9 
10 bool dfs(int u){ //用来寻找增广路
11     for(int i=0;i<m;i++){ //考虑y中所有顶点
12         if(g[u][i]&&!mk[i]){
13             mk[i] = 1; //访问
14             if(cy[i]==-1||dfs(cy[i])){ //未匹配则将i匹配给u,不然从cy[i]也就是说i之前已经匹配的x出发,找增广路,注意这里i已经记录访问过了
15                 cx[u] = i; //把i匹配给u
16                 cy[i] = u; //相互匹配
17                 return 1;
18             }
19         }
20     }
21     return 0; //如果不存在u出发的增广路,返回0
22 }
23 
24 int Hungarian(){
25     int res = 0;
26     memset(cx,-1,sizeof(cx));
27     memset(cy,-1,sizeof(cy));
28     for(int i=0;i<n;i++){
29         if(cx[i]==-1){ //从x中每个没有匹配的店出发寻找增广路
30             memset(mk,0,sizeof(mk));
31             res += dfs(i); //return 为0或1,所以有dfs,就加一
32         }
33     }
34     return res;
35 }
View Code

参考链接:blog.csdn.net/flynn_curry/article/details/52966283 二分图应用

http://blog.csdn.net/thundermrbird/article/details/52231639 二分图理解

原文地址:https://www.cnblogs.com/cmbyn/p/8623925.html