全局最小割问题(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. Spring Boot 使用 slf4j 进行日志记录

    SLF4J,即简单日志门面(Simple Logging Facade forJava),不是具体的日志解决方案,它只服务于各种各样的日志系统.按照官方的说法,SLF4J 是一个用于日志系统的简单Fa ...

  2. HTML5 多媒体

    1.互联网上的音频 直到现在,仍然不存在一项旨在网页上播放音频的标准. 今天,大多数音频是通过插件(比如 Flash)来播放的.然而,并非所有浏览器都拥有同样的插件. HTML5 规定了在网页上嵌入音 ...

  3. mysql基础之增删改查

    标签: mysql 增加数据 -- 增加数据 use myblog; insert into users(username, `password`, realname) values('zhangsa ...

  4. Win10底部任务栏卡死的终极解决方法

    原因:微软自带的资讯和兴趣因国内网络限制,造成失效. 解决方案:底部右键->资讯和兴趣->关闭. 以上仅限WIn10操作系统,win11操作系统以上忽略.

  5. MockQueryable:LINQ查询模拟测试工具

    我们在项目开发过程中,单元测试是确保代码质量的重要环节.涉及数据库LINQ查询逻辑,就需要数据库配合,但这样可能出现性能和数据库并发等问题.下面给推荐一个开源库,为开发者提供了一种简便的方式来模拟LI ...

  6. Redis 中 scan 命令踩坑

    原本以为自己对redis命令还蛮熟悉的,各种数据模型各种基于redis的骚操作.但是最近在使用redis的scan的命令式却踩了一个坑,顿时发觉自己原来对redis的游标理解的很有限.所以记录下这个踩 ...

  7. Spring Boot logback springProperty 设置默认值

    springProperty 当没有读取到source字段中设置的log.path值时,设置为defaultValue字段中的${user.dir}/logs变量值. <springProper ...

  8. 【Rive】眼睛互动动画

    1 前言 ​ 本文基于 Rive 社区开放的眼睛动画,进一步加工处理,实现更有趣的眼睛互动动画. ​ 原始资源见 → Eye Joysticks Demo,效果如下. ​ 原始资源只有一只眼睛,并且没 ...

  9. P10952 聚会 题解

    题目链接 题目大意 对于一棵树,求出一个点对于给定的三个点(以下简称 $x$,$y$,$z$ 且可以重复)距离最短. 题解 对于点的距离,不难想到 LCA 处理.而对于本题,则有两种情况. 第一问 三 ...

  10. IDEA导入他人的项目时提示“project sdk is not defined”的解决办法

    IDEA导入他人的项目时提示"project sdk is not defined"的解决办法 1.在IDEA中,在有问题的项目上单击鼠标右键,然后选择"Open Mod ...