最小割Stoer-Wagner算法
最小割Stoer-Wagner算法
割:在一个图G(V,E)中V是点集,E是边集。在E中去掉一个边集C使得G(V,E-C)不连通,C就是图G(V,E)的一个割;
最小割:在G(V,E)的所有割中,边权总和最小的割就是最小割。
求G的任意s-t最小割Min-C(s,t):
设s,t是途中的两个点且边(s,t)∈E(即s,t之间存在一条边)。如果G的最小割Cut把G分成M,N两个点集
①:如果s∈M,t∈N则Min-C(s,t)= Cut(不讨论)
②:如果s,t∈M(或者s,t∈N)则Min-C(s,t)<= Cut
我们来定义一个Contract(a,b)操作,即把a,b两个点合并,表示为删除节点b,把b的节点信息添加到a上,如下图是做了Contract(5,6)
对于所点v有w(v,5)+=w(v,6)
求s-t最小割的方法
定义w(A,x) = ∑w(v[i],x),v[i]∈A
定义Ax为在x前加入A的所有点的集合(不包括x)
1.令集合A={a},a为V中任意点
2.选取V-A中的w(A,x)最大的点x加入集合
3.若|A|=|V|,结束,否则更新w(A,x),转到2
令倒数第二个加入A的点为s,最后一个加入A的点为t,则s-t最小割为w(At,t)
以Poj (pku) 2914 Minimum Cut
的第三个case为例,图为
G(V,E)
我们设法维护这样的一个w[],初始化为0;
我们把V-A中的点中w[i]最大的点找出来加入A集合;
V-A直到为空
w[]的情况如下
|
w[i] |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
初始值 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
A=A∪{0} |
--- |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
|
A=A∪{1} |
--- |
2 |
2 |
1 |
0 |
0 |
0 |
|
|
A=A∪{2} |
--- |
3 |
1 |
0 |
0 |
0 |
||
|
A=A∪{3} |
--- |
1 |
0 |
0 |
1 |
|||
|
A=A∪{4} |
--- |
1 |
1 |
2 |
||||
|
A=A∪{7} |
2 |
2 |
--- |
|||||
|
A=A∪{5} |
--- |
3 |
||||||
|
A=A∪{6} |
--- |
每次w[i]+=∑(i,a)的权值a∈A
记录最后加入A的节点为t=6,倒数第二个加入A的为s=5,则s-t的最小割就为w[s],在图中体现出来的意思就是5-6的最小割为w[s]=3
然后我们做Contract(s,t)操作,得到下图
G(V’,E’)
重复上述操作
|
w[i] |
0 |
1 |
2 |
3 |
4 |
5 |
7 |
|
初始值 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
A=A∪{0} |
--- |
1 |
1 |
1 |
1 |
0 |
0 |
|
A=A∪{1} |
--- |
2 |
2 |
1 |
0 |
0 |
|
|
A=A∪{2} |
--- |
3 |
1 |
0 |
0 |
||
|
A=A∪{3} |
--- |
1 |
0 |
1 |
|||
|
A=A∪{4} |
--- |
2 |
2 |
||||
|
A=A∪{5} |
--- |
4 |
|||||
|
A=A∪{7} |
--- |
s=5,t=7 s-t最小割是4
Contract(s,t)得到
|
w[i] |
0 |
1 |
2 |
3 |
4 |
5 |
|
初始值 |
0 |
0 |
0 |
0 |
0 |
0 |
|
A=A∪{0} |
--- |
1 |
1 |
1 |
1 |
0 |
|
A=A∪{1} |
--- |
2 |
2 |
1 |
0 |
|
|
A=A∪{2} |
--- |
3 |
1 |
0 |
||
|
A=A∪{3} |
--- |
1 |
1 |
|||
|
A=A∪{4} |
--- |
4 |
||||
|
A=A∪{5} |
--- |
s=4,t=5 s-t最小割是4
Contract(s,t)得到
|
w[i] |
0 |
1 |
2 |
3 |
4 |
|
初始值 |
0 |
0 |
0 |
0 |
0 |
|
A=A∪{0} |
--- |
1 |
1 |
1 |
1 |
|
A=A∪{1} |
--- |
2 |
2 |
1 |
|
|
A=A∪{2} |
--- |
3 |
1 |
||
|
A=A∪{3} |
--- |
2 |
|||
|
A=A∪{4} |
--- |
s=3,t=4 s-t最小割是2,(此时已经得出答案,以下省略)
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <vector>
#include <queue>
#include <cstdlib>
#include <string>
#include <set>
#include <stack>
#define LL long long
#define pii pair<int,int>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = ;
int e[maxn][maxn],n,m;
bool comb[maxn];
int Find(int &s,int &t){
bool vis[maxn];
int w[maxn];
memset(vis,false,sizeof(vis));
memset(w,,sizeof(w));
int tmp = INF;
for(int i = ; i < n; ++i){
int theMax = -INF;
for(int j = ; j < n; j++)
if(!vis[j] && !comb[j] && w[j] > theMax)
theMax = w[tmp = j];
if(t == tmp) break;
s = t;
vis[t = tmp] = true;
for(int j = ; j < n; j++)
if(!vis[j] && !comb[j])
w[j] += e[t][j];
}
return w[t];
}
int solve(){
int ans = INF,s,t;
memset(comb,,sizeof(comb));
for(int i = ; i < n; i++){
s = t = -;
ans = min(ans,Find(s,t));
for(int j = ; j < n; j++){
e[s][j] += e[t][j];
e[j][s] += e[j][t];
}
comb[t] = true;
}
return ans;
}
int main() {
int u,v,w;
while(~scanf("%d %d",&n,&m)){
memset(e,,sizeof(e));
while(m--){
scanf("%d %d %d",&u,&v,&w);
e[u][v] += w;
e[v][u] += w;
}
printf("%d\n",solve());
}
return ;
}
转载自http://blog.sina.com.cn/s/blog_700906660100v7vb.html
最小割Stoer-Wagner算法的更多相关文章
- POJ 2914 Minimum Cut Stoer Wagner 算法 无向图最小割
POJ 2914 题意:给定一个无向图 小于500节点,和边的权值,求最小的代价将图拆为两个联通分量. Stoer Wagner算法: (1)用类似prim算法的方法求"最大生成树" ...
- 图的全局最小割的Stoer-Wagner算法及例题
Stoer-Wagner算法基本思想:如果能求出图中某两个顶点之间的最小割,更新答案后合并这两个顶点继续求最小割,到最后就得到答案. 算法步骤: --------------------------- ...
- 求全局最小割(SW算法)
hdu3002 King of Destruction Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- 网络流 最大流—最小割 之SAP算法 详解
首先引入几个新名词: 1.距离标号: 所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度). 设点i的标号为level[i],那么如果将满足level[i]=l ...
- poj 2914(stoer_wanger算法求全局最小割)
题目链接:http://poj.org/problem?id=2914 思路:算法基于这样一个定理:对于任意s, t V ∈ ,全局最小割或者等于原图的s-t 最小割,或者等于将原图进行 Cont ...
- CQOI2016 不同的最小割 (最小割树模板)(等价流树的Gusfield构造算法)
题目 最小割树模板 算法详解及证明见: 2016年国家队候选队员论文 <浅谈无向图最小割问题的一些算法及应用--绍兴一中 王文涛> 3.2节 CODE #include <bits/ ...
- ZJOI 最小割 CQOI 不同的最小割 (最小割分治)
题目1 ZJOI 最小割 题目大意: 求一个无向带权图两点间的最小割,询问小于等于c的点对有多少. 算法讨论: 最小割 分治 代码: #include <cstdlib> #include ...
- UVALive 5099 Nubulsa Expo 全局最小割问题
B - Nubulsa Expo Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit S ...
- poj2914 Minimum Cut 全局最小割模板题
Minimum Cut Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 8324 Accepted: 3488 Case ...
- POJ2914 (未解决)无向图最小割|Stoer-Wagner算法|模板
还不是很懂,贴两篇学习的博客: http://www.hankcs.com/program/algorithm/poj-2914-minimum-cut.html http://blog.sina.c ...
随机推荐
- 关于SharePoint讨论板的一些知识(2)--视图中的栏目
关于SharePoint讨论板的一些知识(2)--视图中的栏目 新建讨论后,默认显示四个栏目:主题.创建者.答复和上次更新时间. 从功能区的当前视图能够看出这是默认的主 ...
- UVa 11466 - Largest Prime Divisor
題目:給你一個整數n(不超過14位).求出他的最大的素數因子.假设仅仅有一個素數因子輸出-1. 分析:數論. 直接打表計算10^7內的全部素數因子,然後用短除法除n.記錄最大的因子就可以. 假设最後下 ...
- Android笔记之网络状态推断
1.首先当然得在 manifest 中加入检查网络状态的权限: <uses-permission android:name="android.permission.ACCESS_NET ...
- hdoj--2255--奔小康赚大钱(KM算法模板)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- 安装MySQL最后一步出现错误Error Nr.1045解决方法
转自:https://blog.csdn.net/gsls200808/article/details/46846019 安装MySQL最后一步出现错误Error Nr.1045 Connection ...
- 几款jQuery右键菜单插件介绍
在网页中使用自定义右键菜单,实现上皆为使用javascript禁用浏览器默认的右键菜单,然后在网页中响应鼠标右键事件,弹出自定义的菜单. 类似右键菜单的组件网上很多.一般而言,改变浏览器的默认菜单应当 ...
- oracle数据库rman备份与还原
我是oracle 界的小白,由于公司领导要求,不得不硬着头皮在网上找rman备份还原的方法,废话不多说,具体看例子(window) 运行CMD: rman target 管理员账号/密码@orcl 备 ...
- C#怎么清除字符串中HTML标签。。。
因为用到了一款编辑器的原因,使得数据库中保存的数据会夹杂着一些HTML标签,之后导出的数据中就会出现一些不同的HTML的标签.严重影响用户的视觉体验(主要自己都看不下去了)... 下面是我将DataT ...
- jqGrid 排序
jqgrid 排序: 1.前台和后台交互依靠的是index属性,index属性没有设置情况下获取name属性 2.如下状态是经过处理显示的中文,name属性为StatusStr,没有index属性的情 ...
- c++ 编译期与运行期
分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 转自:http://h ...