全局最小割问题(Global Min-Cut Problem)是图论中的一个经典问题,旨在通过切割图中的边来划分图的顶点集合。具体来说,给定一个加权无向图 $ G = (V, E) $,图中每条边 $ e \in E $ 有一个权重 $ w(e) $,全局最小割问题的目标是找到一个划分 $ (S, T) $ 使得从集合 $ S $ 到集合 $ T $ 的边的总权重最小。也就是说,我们希望将图的顶点集合 $ V $ 分割成两个子集 $ S $ 和 $ T $,使得割集 $ \text{cut}(S) $ 的总权重最小,其中割集定义为从 $ S $ 到 $ T $ 的所有边的集合。

形式上,最小割问题的目标是求解以下优化问题:

\[\min_{S \subseteq V} \sum_{u \in S, v \in V \setminus S} w(u, v)
\]

即要找到权重总和最小的一组边集,将无向图划分成两部分。

我们已经了解最大流最小割定理:在网络流图中,最大流等于最小割。这里的最小割和全局最小割的区别在于,最大流—最小割定理主要应用于流网络,其中有明确的源点(Source)和汇点(Sink)。在这种情况下,最小割是指将图划分成两部分,使得源点与汇点之间的流量最小,换句话说,它是指从源点到汇点的最小割集。而在全局最小割问题中,并不要求指定源点和汇点,而是要求找到任何两部分之间的最小割,不管这些部分是否包含特定的源汇结构。因此,全局最小割问题更加普适,适用于任何无向图,并且与特定的源点和汇点无关。

好的,接下来我将详细说明暴力方法以及 Stoer-Wagner 算法中的 1 和 2 部分。

暴力求解

暴力方法的思路是,将无向边改为双向的有向边,首先在图中选取任意一个节点作为源点,然后枚举图中所有其他节点作为汇点。对于每一对源点和汇点,使用最大流算法来计算源点到汇点之间的最大流值,然后通过最大流—最小割定理来得到最小割的值。这个方法的缺点在于每次都需要执行最大流算法,非常低效。

Stoer–Wagner 算法

Stoer–Wagner 算法利用无向图和最小割的性质,使用最大邻接序和递归来求解全局最小割。这个算法基于这样的前提:图中任取两点 \(s\) 和 \(t\),它们要么位于我们要找的全局最小割的一边,要么位于两边

这里,我们并不枚举 \(s\) 和 \(t\) ,因为我们不知道最终的最小割是如何划分的,但根据图的结构,我们能够确定 \(s\) 和 \(t\) 一定是全局最小割中的两个端点之一,然后根据上面的两种情况分治。

最大邻接排序求解 s-t 最小割

我们需要处理两种情况之一:要么 \(s\) 和 \(t\) 位于最小割的同一边,要么它们位于割的两边。对于后一种情况,也就是 \(s\) 和 \(t\) 位于两边的情况,我们使用一个称为 Maximum Adjacency Ordering 的方法来处理。

Maximum Adjacency Ordering 也被称为“最大邻接排序”,它的基本思路是:

  • 从任意一个顶点出发,将其加入“已选节点”。
  • 每轮选择非“已选节点”里,连接到“已选节点”的边权之和最大的节点。
  • 通过这种方式,我们可以得到一个顶点的排列顺序。这个顺序确保了在每次选择时,我们总是优先选择连接当前已选择顶点的边权重最大的顶点。

具体而言,假设我们从任意的起点开始,然后按照“最大邻接边”的顺序遍历图,最终得到一个顶点的排序序列。最后的两个顶点(排序序列中的最后两个节点)就成为了图的 s-t割 中的两个端点。

也可以视为,我们从初始节点视作“大节点”,每次选择“大节点”邻边里权重最大者并入(将其边权附加过来),直到剩下两个点,最后一条边的边权就是最后两个点构成的 s-t割

可以用归纳法证明此贪心策略的正确。每一次合并都不改变图的最小割值,最终剩下的两个点之间的边就是这两点间的一个割,最大邻接排序可以得到正确的结果。


单次时间复杂度

这种贪心——取最大的策略和 prim 或 dijkstra 相同,其复杂度为\(O(V^2)\)(暴力遍历节点)、\(O((V+E) \log V)\)(二叉堆)或 \(O(E+V \log V)\)(斐波那契堆)

合并两个顶点并递归

对于 \(s\) 和 \(t\) 位于同一侧的情况,我们就可以将这两个顶点合并为一个新顶点(将其邻边合并,连接到同一点的边权被相加),并进入下一轮的算法。

为什么合并是对的?

在 Stoer-Wagner 算法中,每次迭代时通过合并顶点来简化问题。这是因为,在最大邻接排序中,顶点 \(s\) 和 \(t\) 已经被识别为割的两端点,接下来考虑的是 \(s\) 和 \(t\) 在同一侧的情况。合并这两个顶点不会改变这种情况下最小割的性质。换句话说,合并顶点相当于“压缩”图的结构,但不会影响最小割的最终结果。因为合并后,新的顶点将保留 \(s\) 和 \(t\) 之间的所有连接信息,且这些连接信息在下一轮计算时依然能帮助我们找到最小割。

合并操作具体来说,就是将 \(s\) 和 \(t\) 合并成一个新的虚拟顶点,并将与这两个顶点相连的所有边重新连接到新的虚拟顶点上。在合并后,剩下的图的规模会减少,新的图中就只剩下 \(V-1\) 个顶点。

然后,算法进入下一轮,继续寻找下一个可能的最小割,直到剩下两个顶点为止。

// Stoer-Wagner 暴力版
// 参考题目:https://www.luogu.com.cn/problem/P5632 class Graph {
vector<vector<int>> adj; // 邻接矩阵
int n;
public:
Graph(int n) : n(n), adj(n, vector<int>(n, 0)) {} void addEdge(int u, int v, int w) {
adj[u][v] = adj[v][u] = w;
} int stoerWagner() {
int res = INT_MAX;
for (int i = 0; i < n - 1; ++i) {
vector<int> ma(n, 0);
ma[0] = INT_MAX; // 选择总是从 0 开始 int s = -1, t = -1;
for (int j = 0; j < n - i - 1; ++j) {
int a = max_element(ma.begin(), ma.end()) - ma.begin(); if (ma[a] == 0) return 0; // Graph is disconnected
ma[a] = -1; if (j == n - i - 2) s = a; // The second last node is s
for (int k = 0; k < n; ++k) {
if (ma[k] >= 0) ma[k] += adj[a][k];
}
}
t = max_element(ma.begin(), ma.end()) - ma.begin(); res = min(res, ma[t]); // Merge nodes s and t
for (int k = 0; k < n; ++k) {
if (k != s && k != t) {
adj[s][k] += adj[t][k];
adj[k][s] = adj[s][k];
adj[t][k] = adj[k][t] = 0;
}
}
} return res;
}
};

总复杂度

Stoer-Wagner 算法的时间复杂度由以下几部分组成:

算法会执行 \(V-1\) 轮迭代,因为每次迭代都会减少一个顶点,直到最终剩下两个顶点。

与单次时间复杂度相乘,整个算法的时间复杂度近似为 \(O(V^3)\)。


Stoer-Wagner 算法通过贪心策略和顶点合并大大降低了时间复杂度,用于解决无源点和汇点的无向图最小割,比暴力方法每次运行最大流算法要高效得多。当然算法是专门为最小割问题设计的,它可能不如最大流算法那样在其他流网络问题中具备广泛的适用性。

割以咏志:Stoer–Wagner 算法求解全局最小割的更多相关文章

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

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

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

    我找到的唯一能看懂的题解:[ZZ]最小割集Stoer-Wagner算法 似乎是一个冷门算法,连oi-wiki上都没有,不过洛谷上竟然有它的模板题,并且2017百度之星的资格赛还考到了.于是来学习一下. ...

  3. 全局最小割StoerWagner算法详解

    前言 StoerWagner算法是一个找出无向图全局最小割的算法,本文需要读者有一定的图论基础. 本文大部分内容与词汇来自参考文献(英文,需***),用兴趣的可以去读一下文献. 概念 无向图的割:有无 ...

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

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

  5. HDU 3691 Nubulsa Expo(全局最小割Stoer-Wagner算法)

    Problem Description You may not hear about Nubulsa, an island country on the Pacific Ocean. Nubulsa ...

  6. 全局最小割Stoer-Wagner算法

    借鉴:http://blog.kongfy.com/2015/02/kargermincut/ 提到无向图的最小割问题,首先想到的就是Ford-Fulkerson算法解s-t最小割,通过Edmonds ...

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

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

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

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

  9. ZOJ 2753 Min Cut (Destroy Trade Net)(无向图全局最小割)

    题目大意 给一个无向图,包含 N 个点和 M 条边,问最少删掉多少条边使得图分为不连通的两个部分,图中有重边 数据范围:2<=N<=500, 0<=M<=N*(N-1)/2 做 ...

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

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

随机推荐

  1. docker部署最新6.2版Zabbix Server端

    一.安装docker,参见本博客docker安装文档. 二.启动空的mysql -e MYSQL_DATABASE="zabbix" \ -e MYSQL_USER="z ...

  2. 对象存储 COS 推出一站式内容审核服务,助力打造绿色互联网

    今年,国家网信办深入推进"清朗·春节网络环境"专项行动.截至3月24日,网信办共累计清理相关违法违规信息208万余条,处置账号7.2万余个,协调关闭.取消备案网站平台2300余家. ...

  3. HarmonyOS鸿蒙开发 - 解决上下两栏白边 - 沉浸式效果

    鸿蒙应用开发从入门到入行 预览器上下两栏白边 自从HarmonyOS升级到release版后,很多同学会问猫林老师:为什么他的预览器上下有白边,为什么明明根容器写了宽高百分百但没铺满.如下图 白边原因 ...

  4. Golang实战:深入解析国密算法在Go语言中的应用与优化

    Golang实战:深入解析国密算法在Go语言中的应用与优化 引言 随着信息技术的迅猛发展,数据安全成为企业和个人关注的焦点.国密算法(SM系列算法)作为我国自主研发的密码算法标准,逐渐在各个领域中得到 ...

  5. Linux 查看 && 修改端口范围限制

    1.显示当前临时端口的范围: sysctl net.ipv4.ip_local_port_range或 cat /proc/sys/net/ipv4/ip_local_port_range一般情形下: ...

  6. shell 判断是否已安装了某个软件

    判断是否安装了node 复制if ! type node >/dev/null 2>&1; then echo 'node 未安装'; else echo 'node 已安装'; ...

  7. 龙哥收集的Github资源——Python量化不要自己造轮子

      打开github后,在搜索框中输入下面的项目作者及项目名称,然后点一下 All Github 搜索 格式 user:xxxxx in:name xxxxxxxxxxxxx 举例 user:Cken ...

  8. Qt加载天地图离线api开发包/从官网趴地图js代码/费了九牛二虎之力终于搞定

    一.前言说明 网上关于如何趴天地图离线api文件的文章,只有少量的两三篇,而且几乎没有说全和说对,搞得评论也是一片懵逼,这里不行那你不行,思路可以借鉴就是.索性花了点时间,自己研究了如何从官网一步步趴 ...

  9. opencv_contrib编译:fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory

    在Ubuntu上编译opencv3.4.2源码时,遇到下面的错误,错误1:/home/src/software/opencv-3.4.2/modules/stitching/include/openc ...

  10. IdentityServer网页登陆-登陆原理

    前言 现代程序开发中身份验证.授权是一件非常非常复杂的事情(各种登陆方式.各种授权需求.各种跳转跳.各种加解密,搞得得头皮发麻),因为事情本身复杂,所以没把这件事理清楚之前,无论你用什么语言.什么框架 ...