全局最小割问题(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. 【kernel】从 /proc/sys/net/ipv4/ip_forward 参数看如何玩转 procfs 内核参数

    本文的开篇,我们先从 sysctl 这个命令开始. sysctl 使用 sysctl 是一个 Linux 系统工具,后台实际上是 syscall,它允许用户查看和动态修改内核参数. # 查看当前设置的 ...

  2. 《JavaScript 模式》读书笔记(5)— 对象创建模式3

    这一篇,我们主要来学习了解下沙箱模式以及静态成员的相关内容. 五.沙箱模式 沙箱模式(sandbox pattern)解决了命名空间模式的如下几个缺点: 对单个全局变量的依赖变成了对应用程序的全局变量 ...

  3. IO介绍-上

    IO IO系统管理的主要对象是IO设备和相应的设备控制器.其主要任务是,完成用户提出的IO请求,提高IO效率,以及提高设备的利用率.并能为更高层的进程方比那使用这些设备提供手段. IO系统的基本功能 ...

  4. CVE-2023-0461 漏洞分析与利用

    PS: 文章首发于补天社区 漏洞分析 tcp_set_ulp里面会分配和设置 icsk->icsk_ulp_data,其类型为 tls_context tcp_setsockopt do_tcp ...

  5. 【分块】LibreOJ 6278 数列分块入门2

    题目 https://loj.ac/p/6278 题解 将 \(n\) 个元素的数组 \(a\) 按块长 \(\sqrt{n}\) 进行分块处理.为每个块设置一个懒添加标记 \(add[i]\),代表 ...

  6. 在TOMCAT8.5使用 JOSSO 单点登录(Agent 端)

    网上找到的玩法都是用 josso 给的命令行工具加工 tomcat,这个办法有不少问题: 1. tomcat8.5 还不支持 2. 很难配置,这让我险些放弃 tomcat8.5,用 tomcat8,但 ...

  7. mysql5.7以后group by 报错 sql_mode=only_full_group_by的解决方法

    一.发现问题 1.查询语句 SELECT * from class group by class_name; 2.报错结果 ..... this is incompatible with sql_mo ...

  8. Qt/C++音视频开发77-获取本地有哪些摄像头名称/ffmpeg命令日志方式

    一.前言 上一篇文章讲使用ffmpeg函数接口去获取本地摄像头信息,这种方式只能从ffmpeg5版本开始才具备,那ffmpeg3/4只能干瞪眼?那肯定不行的,必须要想办法打通这个功能,查阅信息发现可以 ...

  9. [转]关于java中JButton的样式设置(的一些我们应该知道的函数)

    1. 对JButton大小的设置 --因为JButen是属于小器件类型的,所以一般的setSize不能对其惊醒大小的设置,所以一般我们用 button.setPreferredSize(new Dim ...

  10. 深度解析Mamba与状态空间模型:一图带你轻松入门

    1.概述 Transformer架构无疑是大型语言模型(LLMs)成功背后的核心动力.从开源的Mistral到封闭的ChatGPT,几乎所有主流的LLM都在使用这一架构.然而,随着技术的不断进步,研究 ...