二分图最大匹配模板【匈牙利;Dinic最大流】
2017-12-23 22:43
225 查看
二分图最大匹配模板【匈牙利;Dinic最大流】
匈牙利算法
int n,m; vector<int> map[100010]; int match[100010];//保存匹配的互相点 bool vis[100010]; bool dfs(int u) { for(int j=0;j<map[u].size();j++) { int v=map[u][j]; if(!vis[v]) { vis[v]=true; if(!match[v]||dfs(match[v])) { match[v]=u; return true; } } } return false; } int solve() { int ans=0; for(int i=1;i<=n;i++) { memset(vis,false,sizeof(vis)); if(dfs(i)) ans++; } return ans; }
十分简洁好理解的版,就是不断找增广路
Dinic最大流
最大流的版本重点在于建图建图后可套入任何一个最大流模板
求出的最大流即为最大匹配
不会最大流的小伙伴可以看我的博客
图论算法-网络最大流【EK;Dinic】
[b]建边过程:[/b]
int n,m,e; //n,m分别为两个点集点数;e为原图中的边 cin>>n>>m>>e; for(int i=1;i<=e;i++) { int u,v; cin>>u>>v; add(u,v+n,1);//先建原图的边,要注意节点编号以题目为准 add( 4000 v+n,u,0); } int s=0,t=n+m+1;//建立超级源点和超级汇点 for(int i=1;i<=n;i++) { add(0,i,1); add(i,0,0);//将超级源点对X点集每个点引一条容量为1的边 } for(int i=n+1;i<=n+m;i++) { add(i,t,1);将Y点集每个点向超级汇点引一条容量为1的边 add(t,i,0); }
相关文章推荐
- 二分图最大匹配(匈牙利算法-DFS增广模板)
- 【模板】匈牙利算法 二分图最大匹配题模板
- 求二分图最大匹配——匈牙利算法模板。
- HDU 2063 过山车 【二分图最大匹配(匈牙利模板)】
- 【模板】二分图最大匹配(匈牙利算法)
- 匈牙利算法求二分图的最大匹配/匈牙利算法模板
- 【模板】匈牙利算法——二分图最大匹配
- 二分图最大匹配匈牙利算法模板两种
- hihocoder #1122 二分图二•二分图最大匹配之匈牙利算法(*【模板】应用 )
- POJ 1469 COURSES【匈牙利算法入门 二分图的最大匹配 模板题】
- 二分图最大匹配 匈牙利算法 (自己写的模板)
- (模板题)poj 3041 Asteroids(二分图的最大匹配匈牙利算法)
- 匈牙利算法模板 二分图最大匹配
- POJ 1469 COURSES【匈牙利算法入门 二分图的最大匹配 模板题】
- 二分图最大匹配模板(匈牙利算法)
- 二分图最大匹配算法-匈牙利算法(Hungary)模板
- 51Nod 飞行员配对(二分图最大匹配)(匈牙利算法模板题)
- 二分图最大匹配匈牙利算法(poj)3041(模板)
- POJ3041 二分图(性质)最小点覆盖等于最大匹配数(匈牙利模板题)
- 二分图最大匹配 匈牙利算法模板