二分图匹配学习——匈牙利算法模板
来源:互联网 发布:多益网络ipo结果 编辑:程序博客网 时间:2024/06/08 19:01
DFS(邻接矩阵)
const int MAXN=1000;int p,n; //u,v数目int g[MAXN][MAXN];//左右集合连接情况int linker[MAXN];bool used[MAXN];bool dfs(int u){ int v; for(v=1; v<=n; v++) if(g[u][v]&&!used[v]) { used[v]=true; if(linker[v]==-1||dfs(linker[v])) { linker[v]=u; return true; } } return false;}int hungary(){ int res=0; int u; memset(linker,-1,sizeof(linker)); for(u=1; u<=p; u++) { memset(used,0,sizeof(used)); if(dfs(u)) res++; } return res;}
DFS(邻接表)
const int MAXN=10050;int linker[MAXN];bool used[MAXN];vector<int>g[MAXN];int n;bool dfs(int u){ for(int i=0; i<g[u].size(); i++) { if(!used[g[u][i]]) { used[g[u][i]]=true; if(linker[g[u][i]]==-1||dfs(linker[g[u][i]])) { linker[g[u][i]]=u; return true; } } } return false;}int hungary(){ int u; int res=0; memset(linker,-1,sizeof(linker)); for(u=1; u<=n; u++) { memset(used,false,sizeof(used)); if(dfs(u)) res++; } return res;}
BFS
const int MAXN = 1000;int g[MAXN][MAXN];int Mx[MAXN], My[MAXN], p, n;int chk[MAXN];int Q[MAXN];int pre[MAXN];int hungary(){ int res = 0; int qs, qe; memset(Mx, -1, sizeof(Mx)); memset(My, -1, sizeof(My)); memset(chk, -1, sizeof(chk)); for (int i = 1; i <= p; i++) { if (Mx[i] == -1) //对于x集合中的每个没有匹配的点i进行一次bfs找交错轨 { qs = qe = 0; Q[qe++] = i; pre[i] = -1; bool flag = 0;//判断是否找到 while (qs < qe && !flag) { int u = Q[qs]; for (int v = 1; v <= n && !flag; v++) if (g[u][v]//如果u和v相连 && chk[v] != i)//并且v没有被u check过 { chk[v] = i; Q[qe++] = My[v];//放进 if (My[v] >= 0)//如果v和其他的相连,则修改之 pre[My[v]] = u; else //直到找到一个u和v都没有用过的 { flag = 1; int d = u, e = v; while (d != -1) //确保回到最初 { int t = Mx[d]; Mx[d] = e; My[e] = d; d = pre[d]; e = t; } } } qs++; } if (Mx[i] != -1) res++; } } return res;}
Hopcroft-Carp算法
#define MAXN 128const int INF = 1 << 28;int g[MAXN][MAXN], Mx[MAXN], My[MAXN], Nx, Ny;int dx[MAXN], dy[MAXN], dis;bool vst[MAXN];bool searchP(void){queue<int> Q;dis = INF;memset(dx, -1, sizeof(dx));memset(dy, -1, sizeof(dy));for (int i = 0; i < Nx; i++){if (Mx[i] == -1){Q.push(i);dx[i] = 0;}}while (!Q.empty()){int u = Q.front(); Q.pop();if (dx[u] > dis)break;for (int v = 0; v < Ny; v++){if (g[u][v] && dy[v] == -1){dy[v] = dx[u]+1;if (My[v] == -1)dis = dy[v];else{dx[My[v]] = dy[v]+1;Q.push(My[v]);}}}}return dis != INF;}bool DFS(int u){for (int v = 0; v < Ny; v++){if (!vst[v] && g[u][v] && dy[v] == dx[u]+1){vst[v] = 1;if (My[v] != -1 && dy[v] == dis)continue;if (My[v] == -1 || DFS(My[v])){My[v] = u;Mx[u] = v;return 1;}} }return 0;}int MaxMatch(void){int res = 0;memset(Mx, -1, sizeof(Mx));memset(My, -1, sizeof(My));while (searchP()){memset(vst, 0, sizeof(vst));for (int i = 0; i < Nx; i++){if (Mx[i] == -1 && DFS(i))//if (dx[i] == 0 && DFS(i))res++;}}return res;}
0 0
- 二分图匹配学习——匈牙利算法模板
- 【模板】匈牙利算法——二分图最大匹配
- 二分图匹配——匈牙利算法模板
- 匈牙利算法(二分图匹配)模板
- 二分图最大匹配模板(匈牙利算法)
- 二分图匹配(匈牙利算法模板)
- 匈牙利算法模板 二分图最大匹配
- 二分图匹配——匈牙利算法
- 二分图最大匹配—匈牙利算法
- 二分图匹配—匈牙利算法
- 二分图匹配—匈牙利算法
- 【二分图匹配】最大二分匹配——匈牙利算法
- 【二分匹配匈牙利算法模板】
- 学习笔记-二分图匹配(匈牙利算法)
- 二分图匹配及匈牙利算法学习
- 匈牙利算法,二分图最大匹配、多重匹配模板
- 【模板】匈牙利算法 二分图最大匹配题模板
- 二分图最大匹配算法-匈牙利算法(Hungary)模板
- JAVA 基础(面向对象)
- TCP/IP协议之三(TCP连接的建立与断开)
- 杭电 1513 Palindrome(LCS)
- Serializable的实例
- 输入流&输出流经典案例
- 二分图匹配学习——匈牙利算法模板
- java之集合Collection 详解之4
- nyoj100 1的个数
- MySQL的MyISAM和InnoDB存储引擎表结构
- Poj 2002 Squares(二分&&STL)
- SmartImageView
- hdu 1058 Humble Numbers(dp)
- JAVA 基础 (static关键字)
- 8种Nosql数据库系统对比