我找到的唯一能看懂的题解:【ZZ】最小割集Stoer-Wagner算法

似乎是一个冷门算法,连oi-wiki上都没有,不过洛谷上竟然有它的模板题,并且2017百度之星的资格赛还考到了。于是来学习一下。

一些定义

无向图的(全局)最小割:一个边权和最小的边集,断掉后图不联通。

算法

我们自然可以直接钦定一个 \(S\),枚举 \(T\),求最小割,其中最小值即为答案。不过复杂度过于高,大概是 \(O(n^3m)\),当遇到稠密图的时候,就是 \(O(n^5)\)。(尽管这个复杂度非常虚,靠信仰或许能通过题)如果我们用最小割树,复杂度不会变。因此我们需要一个更快捷的方法。

流程

(没写证明是因为不会证明)

设 \(w[p]\) 表示点集外一点 \(p\) 到当前维护的点集中所有点的权值和(类似加权度数)。

  1. 找到当前图中 \(w[p]\) 最大的点 \(p\),将 \(p\) 加入到当前集合,并更新其它 \(w[p]\)。

  2. 若集合不为全集,则重复 1 操作。

  3. 设最后加入点集的两点为 \(s, t\)(..., \(s\), \(t\)),最后的 \(w[t]\) 即为 \(s, t\) 的最小割。用此最小割更新答案,并合并 \(s, t\).

  4. 若当前点数仍大于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算法)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. HDU 6081 度度熊的王国战略(全局最小割Stoer-Wagner算法)

    Problem Description 度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族. 哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士. 所以这一场战争,将会十分艰难. 为了更 ...

  7. HDU 6081 度度熊的王国战略(全局最小割堆优化)

    Problem Description度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族.哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士.所以这一场战争,将会十分艰难.为了更好的进攻 ...

  8. HDU 3691 Nubulsa Expo(全局最小割)

    Problem DescriptionYou may not hear about Nubulsa, an island country on the Pacific Ocean. Nubulsa i ...

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

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

随机推荐

  1. Python爬虫实战,完整的思路和步骤(附源码)

    前言 小的时候心中总有十万个为什么类似的问题,今天带大家爬取一个问答类的网站. 本堂课使用正则表达式对文本类的数据进行提取,正则表达式是数据提取的通用方法. 环境介绍: python 3.6 pych ...

  2. 微信小程序-超出部分显示省略号(单行与多行)

    /*单行*/ .work_font{ display:block /*这里设置inline-block或者block:根据使用情况来定(行内元素需要加这个,块级元素和行内块级可以不用)*/ white ...

  3. python计算矩阵均匀分布程度

    计算N×M(建议维度大于100*100)的0,1矩阵均匀分布程度,值由0到1表示不均匀到均匀 import numpy as np def make_rand_matrix(side=20): # 制 ...

  4. STL标准函数库学习小总结

    浅谈STL(未完)前言:(1)学习资料——<算法笔记>第六章.<常用基础数据结构>文档 (2)测试平台——Codeup新家(<算法笔记>对应OJ).洛谷.YCOJ ...

  5. 用户不在sudoers文件中怎么办,ziheng is not in the sudoers file解决方法

    sudo是linux系统中,用来执行需要权限命令,但是一些朋友使用sudo时,出现下面的错误“ziheng is not in the sudoers file. This incident will ...

  6. asp.net core 发布包含文件

    这样这个文件在发布的时候,就会包含进去了.

  7. 图片文件分布式存储方案设计模式(c#--sqlserver)

    1.为了降低web服务器的压力,申请了2台文件服务器,用来存放图片文件.但是两台文件服务器如何让程序自己选择呢? 于是我用了一个算法,思路如下: 从状态表筛选出可用的图片服务器集合记作C,并获取集合的 ...

  8. Pytorch | 详解Pytorch科学计算包——Tensor

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Pytorch专题的第二篇,我们继续来了解一下Pytorch中Tensor的用法. 上一篇文章当中我们简单介绍了一下如何创建一个Ten ...

  9. Meta标签大全_web开发常用meta整理

    meta标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 web 服务. 必要属性 属性 值 描 ...

  10. Mariadb之复制过滤器

    mariadb的主从复制集群,默认情况下是把主库上的所有库进行复制,只要在主库上产生写操作,从库基于主库的二进制日志做重放,从而实现把主库的上的库表复制到从库:复制过滤器指的是我们仅复制一个或几个数据 ...