SW算法求全局最小割(Stoer-Wagner算法)
我找到的唯一能看懂的题解:【ZZ】最小割集Stoer-Wagner算法
似乎是一个冷门算法,连oi-wiki上都没有,不过洛谷上竟然有它的模板题,并且2017百度之星的资格赛还考到了。于是来学习一下。
一些定义
无向图的(全局)最小割:一个边权和最小的边集,断掉后图不联通。
算法
我们自然可以直接钦定一个 \(S\),枚举 \(T\),求最小割,其中最小值即为答案。不过复杂度过于高,大概是 \(O(n^3m)\),当遇到稠密图的时候,就是 \(O(n^5)\)。(尽管这个复杂度非常虚,靠信仰或许能通过题)如果我们用最小割树,复杂度不会变。因此我们需要一个更快捷的方法。
流程
(没写证明是因为不会证明)
设 \(w[p]\) 表示点集外一点 \(p\) 到当前维护的点集中所有点的权值和(类似加权度数)。
找到当前图中 \(w[p]\) 最大的点 \(p\),将 \(p\) 加入到当前集合,并更新其它 \(w[p]\)。
若集合不为全集,则重复 1 操作。
设最后加入点集的两点为 \(s, t\)(..., \(s\), \(t\)),最后的 \(w[t]\) 即为 \(s, t\) 的最小割。用此最小割更新答案,并合并 \(s, t\).
若当前点数仍大于2,则清空集合,回到 1 操作。
由此可知,SW 算法的复杂度是 \(O(n^3)\)。
关键代码
使用邻接矩阵更方便。
int v[N][N], w[N], s, t;//邻接矩阵,加权度数,源汇
bool del[N], vis[N];//是否因合并被删除,是否在点集里
inline int search() {//将点逐个加入点集,得到s,t,s-t最小割
memset(w, 0, sizeof(w));
memset(vis, 0, sizeof(vis));//清空集合
s = 0, t = 0;
int res = inf;
while(1) {
int p = 0, mx = -inf;
for (register int i = 1; i <= n; ++i) if (!del[i] && !vis[i])
if (w[i] > mx) mx = w[i], p = i;
vis[p] = true;
if (!p) return res;//没有点集以外的点了
s = t, t = p;
res = w[p];
for (register int i = 1; i <= n; ++i) if (!del[i] && !vis[i])
w[i] += v[i][p];
}
}
inline void SW() {//更新答案,合并
int ans = inf;
for (register int i = 1; i < n; ++i) {
MIN(ans, search());
if (!ans) break;
del[t] = true;
for (register int j = 1; j <= n; ++j) if (!del[j]) {
v[s][j] += v[t][j];
v[j][s] += v[j][t];//无向图合并
}
}
printf("%d\n", ans);
}
感性理解
博客里说和 prim 算法有关系,但是我并不精通 prim 算法,因此理解起来会很费劲。
现在我要发挥shadowice精神了
纯属口胡,无任何逻辑。
\(w[p]\) 为 \(p\) 到点集的“加权度数”,可以衡量 \(p\) 与点集的“紧密度”。我们每次首先选择与点集“紧密度”更大的点加入点集,最后加入的 \(s, t\) 就是与图“紧密度”最小的点了,因此 \(w[t]\) 是将 \(t\) 这个最“边远”的点割离图的最小费用。
如果 \(s, t\) 在最终的最小割中不在同一连通块,那么答案会被这一轮计算出来;如果 \(s, t\) 在同一连通块,那么合并 \(s, t\) 也对答案没有影响。
相关题目
P5632 【模板】Stoer-Wagner算法
模板题
hdu 3002 King of Destruction
模板题
hdu 6081 度度熊的王国战略
n <= 3000。尽管给了 20 秒,这道题仍然是不可做题。不过可以拿贪心水过。
SW算法求全局最小割(Stoer-Wagner算法)的更多相关文章
- poj 2914(stoer_wanger算法求全局最小割)
题目链接:http://poj.org/problem?id=2914 思路:算法基于这样一个定理:对于任意s, t V ∈ ,全局最小割或者等于原图的s-t 最小割,或者等于将原图进行 Cont ...
- 求全局最小割(SW算法)
hdu3002 King of Destruction Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- 图的全局最小割的Stoer-Wagner算法及例题
Stoer-Wagner算法基本思想:如果能求出图中某两个顶点之间的最小割,更新答案后合并这两个顶点继续求最小割,到最后就得到答案. 算法步骤: --------------------------- ...
- 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 ...
- HDU 6081 度度熊的王国战略(全局最小割Stoer-Wagner算法)
Problem Description 度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族. 哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士. 所以这一场战争,将会十分艰难. 为了更 ...
- HDU 6081 度度熊的王国战略(全局最小割堆优化)
Problem Description度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族.哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士.所以这一场战争,将会十分艰难.为了更好的进攻 ...
- HDU 3691 Nubulsa Expo(全局最小割)
Problem DescriptionYou may not hear about Nubulsa, an island country on the Pacific Ocean. Nubulsa i ...
- POJ 2914 Minimum Cut Stoer Wagner 算法 无向图最小割
POJ 2914 题意:给定一个无向图 小于500节点,和边的权值,求最小的代价将图拆为两个联通分量. Stoer Wagner算法: (1)用类似prim算法的方法求"最大生成树" ...
随机推荐
- java map里面进行ASCII 码从小到大排序(字典序)
public static String getAsciiSort(Map<String, Object> map) { List<Entry<String, Object&g ...
- java之FTP上传下载
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...
- 入门大数据---Kylin搭建与应用
由于Kylin官网已经是中文的了,而且写的很详细,这里就不再重述. 学习右转即可. 这里说个遇到的问题,当在Kylin使用SQL关键字时,要加上双引号,并且里面的内容要大写,这个和MySql有点区别需 ...
- Salesforce LWC学习(十八) datatable展示 image
本篇参看: https://developer.salesforce.com/docs/component-library/bundle/lightning-datatable/documentati ...
- Spring AOP学习笔记05:AOP失效的罪因
前面的文章中我们介绍了Spring AOP的简单使用,并从源码的角度学习了其底层的实现原理,有了这些基础之后,本文来讨论一下Spring AOP失效的问题,这个问题可能我们在平时工作中或多或少也会碰到 ...
- P2629 【好消息,坏消息】
其实刚开始看到这道题,应该很多都会想到区间DP中的合并石子,开一个2倍的空间(严格来说的话应该是2n-1),将本来的环变成一个链式的结构.然后对于得到的消息,可以预处理一个前缀和,这样就可以很方便的知 ...
- 简述vue的双向绑定原理
一.前言 在vue的视图层与modal层进行数据交互的时,视图层的数据传入到modal层,modal层通过defineProperty来劫持每个元素,并绑定监听事件进行监听,一旦监听到数据变化,就通过 ...
- Oracle IO性能测试
Oracle IO性能测试 前言 最近发生了迁移测试库后(单节点迁移RAC)因为IO性能问题导致迁移后性能非常差的问题. 原本想在创建ASM磁盘组之前用Orion做测试,但是忘了做就没做结果出了这档子 ...
- (私人收藏)React教程手册
React教程手册 https://pan.baidu.com/s/1ka2PJ54HgqJ8lC6XgbvdLg pedx React 教程 含有3个附件,如下: react.js react-do ...
- css引入的方式有哪些_四种css的引入方式与特点
在网页中css主要负责html文档的样式显示,目前css主要有4种引入方式:行内式.内嵌式.导入式.链接式. 1.行内式 行内式也叫内联样式,是指标记的style属性中设定CSS样式,这种方式没有体现 ...