最小割Stoer-Wagner算法

割:在一个图G(V,E)中V是点集,E是边集。在E中去掉一个边集C使得G(V,E-C)不连通,C就是图G(V,E)的一个割;

最小割:在G(V,E)的所有割中,边权总和最小的割就是最小割。

G的任意s-t最小割Min-Cst):

设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算法的更多相关文章

  1. POJ 2914 Minimum Cut Stoer Wagner 算法 无向图最小割

    POJ 2914 题意:给定一个无向图 小于500节点,和边的权值,求最小的代价将图拆为两个联通分量. Stoer Wagner算法: (1)用类似prim算法的方法求"最大生成树" ...

  2. 图的全局最小割的Stoer-Wagner算法及例题

    Stoer-Wagner算法基本思想:如果能求出图中某两个顶点之间的最小割,更新答案后合并这两个顶点继续求最小割,到最后就得到答案. 算法步骤: --------------------------- ...

  3. 求全局最小割(SW算法)

    hdu3002 King of Destruction Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  4. 网络流 最大流—最小割 之SAP算法 详解

    首先引入几个新名词: 1.距离标号: 所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度). 设点i的标号为level[i],那么如果将满足level[i]=l ...

  5. poj 2914(stoer_wanger算法求全局最小割)

    题目链接:http://poj.org/problem?id=2914 思路:算法基于这样一个定理:对于任意s, t   V ∈ ,全局最小割或者等于原图的s-t 最小割,或者等于将原图进行 Cont ...

  6. CQOI2016 不同的最小割 (最小割树模板)(等价流树的Gusfield构造算法)

    题目 最小割树模板 算法详解及证明见: 2016年国家队候选队员论文 <浅谈无向图最小割问题的一些算法及应用--绍兴一中 王文涛> 3.2节 CODE #include <bits/ ...

  7. ZJOI 最小割 CQOI 不同的最小割 (最小割分治)

    题目1 ZJOI 最小割 题目大意: 求一个无向带权图两点间的最小割,询问小于等于c的点对有多少. 算法讨论: 最小割 分治 代码: #include <cstdlib> #include ...

  8. UVALive 5099 Nubulsa Expo 全局最小割问题

    B - Nubulsa Expo Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit S ...

  9. poj2914 Minimum Cut 全局最小割模板题

    Minimum Cut Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 8324   Accepted: 3488 Case ...

  10. POJ2914 (未解决)无向图最小割|Stoer-Wagner算法|模板

    还不是很懂,贴两篇学习的博客: http://www.hankcs.com/program/algorithm/poj-2914-minimum-cut.html http://blog.sina.c ...

随机推荐

  1. sqlite3树形结构遍历效率对照測试

    sqlite3树形结构遍历效率对照測试 一.缘起 项目数据结构:本人从事安防行业,视频监控领域.项目中会遇到监控点位的组织机构划分.暂时划分的巡逻点位等.这些相机点位.连同组织机构,它们在逻辑关系上构 ...

  2. 安装多个版本号jdk后java -version不改变的问题解决

    1.问题 比方先安装了jdk7后,再安装jdk6,java -version就是显示java1.6,即使把JAVA_HOME和path改动为java7的路径,java -version依旧还是显示6. ...

  3. iOS 隐藏NavigationBar的方法

    使用下面方法: - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationCon ...

  4. 【撸码caffe 三】 caffe.cpp

    caffe.cpp文件完成对网络模型以及模型配置参数的读入和提取,提供了网络模型训练的入口函数train和对模型的测试入口函数test.文件中使用了很多gflags和glog指令,gflags是goo ...

  5. [POI 2007] 堆积木

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1109 [算法] DP [代码] #include<bits/stdc++.h& ...

  6. Intellij IDEA社区版打包Maven项目成war包,并部署到tomcat上

    转自:https://blog.csdn.net/yums467/article/details/51660683 需求分析 我们利用 Intellij idea社区版IDE开发了一个maven的sp ...

  7. shp系列(四)——利用C++进行Shx文件的读(打开)

    1.shx文件的基本情况 shx文件又叫索引文件,主要包含坐标文件的索引信息,文件中每个记录包含对应的坐标文件记录距离坐标文件的初始位置的偏移量.通过索引文件可以很方便地在坐标文件中定位到指定目标的坐 ...

  8. Gitlab 维护措施

    Gitlab 升级: https://jingyan.baidu.com/article/72ee561ab1b333e16038df63.html Gitlab Rpm包地址: https://pa ...

  9. [转]解决C# WinForm 中 VSHOST.EXE 程序不关闭的问题

    右击“解决方案”--属性-调试栏-启用调试器部分-“启用Visual studio宿主进程”不勾选

  10. 利用JavaScript实现文本框改文字功能

    <html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...