全局最小割Stoer-Wagner算法
借鉴:http://blog.kongfy.com/2015/02/kargermincut/
提到无向图的最小割问题,首先想到的就是Ford-Fulkerson算法解s-t最小割,通过Edmonds–Karp实现可以在O(nm2)时间内解决这个问题(n为图中的顶点数,m为图中的边数)。
但是全局最小割和s-t最小割不同,并没有给定的指定的源点s和汇点t,如果通过Ford-Fulkerson算法来解这一问题,则需要枚举汇点t(共n−1),时间复杂度为O(n2m2)。
Can we do better?
答案是肯定的,Karger在攻读博士学位期间(Orz…)提出了非常著名的基于随机化的全局最小割算法,算法非常简单,简单到不敢相信它是正确的,算法描述如下:
- 在图中随机取一条边,将边的两个端点合并(contraction),同时消除所有由于合并而形成自环的边
Contraction
- 重复步骤1直到图中仅剩下两个点
- 将最终两点之间的边作为找的割返回
合并的边权值相加
1.min=MAXINT,固定一个顶点P
2.从点P用“类似”prim的s算法扩展出“最大生成树”,记录最后扩展的顶点和最后扩展的边
3.计算最后扩展到的顶点的切割值(即与此顶点相连的所有边权和),若比min小更新min
4.合并最后扩展的那条边的两个端点为一个顶点(当然他们的边也要合并,这个好理解吧?)
5.转到2,合并N-1次后结束
6.min即为所求,输出min
prim本身复杂度是O(n^2),合并n-1次,算法复杂度即为O(n^3),如果在prim中加堆优化,复杂度会降为O((n^2)logn)0.
#include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <cctype> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <cmath> #include <bitset> #define rap(i, a, n) for(int i=a; i<=n; i++) #define rep(i, a, n) for(int i=a; i<n; i++) #define lap(i, a, n) for(int i=n; i>=a; i--) #define lep(i, a, n) for(int i=n; i>a; i--) #define rd(a) scanf("%d", &a) #define rlld(a) scanf("%lld", &a) #define rc(a) scanf("%c", &a) #define rs(a) scanf("%s", a) #define rb(a) scanf("%lf", &a) #define rf(a) scanf("%f", &a) #define pd(a) printf("%d\n", a) #define plld(a) printf("%lld\n", a) #define pc(a) printf("%c\n", a) #define ps(a) printf("%s\n", a) #define MOD 2018 #define LL long long #define ULL unsigned long long #define Pair pair<int, int> #define mem(a, b) memset(a, b, sizeof(a)) #define _ ios_base::sync_with_stdio(0),cin.tie(0) //freopen("1.txt", "r", stdin); using namespace std; const int maxn = 105, INF = 0x7fffffff;int n, m; int way[maxn][maxn], d[maxn], bin[maxn]; bool vis[maxn];int contract(int &s, int &t) {mem(vis, false);mem(d, 0);int k, maxc, ans;rap(i, 1, n){k = -1, maxc = -INF;rap(j, 1, n)if(!bin[j] && !vis[j] && d[j] > maxc)k = j, maxc = d[j];if(k == -1) return ans;s = t, t = k, ans = maxc;vis[k] = true;rap(j, 1, n)if(!bin[j] && !vis[j])d[j] += way[k][j];}return ans; }int SW() {int mincut = INF, ans, s, t;rep(i, 1, n){ans = contract(s, t);bin[t] = 1;mincut = min(ans, mincut);if(mincut == 0) return 0;rap(j, 1, n)if(!bin[j])way[s][j] = (way[j][s] += way[j][t]);}return mincut; }int main() {while(scanf("%d%d", &n, &m) != EOF){mem(way, 0);mem(bin, 0);int u, v, w;rap(i, 1, m){rd(u), rd(v), rd(w);u++, v++;way[u][v] += w;way[v][u] += w;}cout << SW() << endl;}return 0; }
转载于:https://www.cnblogs.com/WTSRUVF/p/10008678.html
全局最小割Stoer-Wagner算法相关推荐
- 【HDU - 3002】King of Destruction(无向图全局最小割,SW算法,模板题)
题干: Zhou xingxing is the successor of one style of kung fu called "Karate Kid".he is falli ...
- poj 2914(stoer_wanger算法求全局最小割)
题目链接:http://poj.org/problem?id=2914 思路:算法基于这样一个定理:对于任意s, t V ∈ ,全局最小割或者等于原图的s-t 最小割,或者等于将原图进行 Cont ...
- 【HDU - 6081】度度熊的王国战略(SW算法,全局最小割)
题干: Problem Description 度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族. 哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士. 所以这一场战争,将会十分艰难. ...
- POJ - 2914 Minimum Cut(全局最小割-Stoer_Wagner)
题目链接:点击查看 题目大意:给出一张无向图,要求将其分为两个集合,使得最小割最小 题目分析:算法学习自:https://blog.csdn.net/dingdi3021/article/detail ...
- Stoer-Wagner无向图全局最小割(hduoj 3691 Nubulsa Expo)
题意: 一张n个点m条边的无向图,每个点都有一个最大流量,给定起点S,问如何选取终点T,使得最大流最大 翻译一下: 一张n个点m条边的无向联通图,你要割掉一些边使整张图不连通,但是割掉每条边都需要一定 ...
- 最大流最小割经典例题_最大流, 最小割问题及算法实现
本博客采用创作共用版权协议, 要求署名.非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议. 由于博文中包含一些LaTex格式数学公式, 在简书中显示不好, 所以 ...
- 基于最小割的分割算法(Min-Cut Based Segmentation)
参考: https://www.cnblogs.com/ironstark/p/5008258.html https://github.com/Ewenwan/MVision/blob/master/ ...
- 最小割(Stoer-Wagner算法)
Stoer-Wagner算法 简介: 割:在一个图G(V,E)中V是点集,E是边集.在E中去掉一个边集C使得G(V,E-C)不连通,C就是图G(V,E)的一个割: 最小割:在G(V,E)的所有割中,边 ...
- 最小割(min cut)算法
0引言 图像分割可以看作不同的划分问题,而图可以进行不同的划分,将图像映射为图后,分割问题就可以用图论方法(如:最小割)求解.这只是直观地解释,具体如何将图像分割转化为求图的最小割呢?本文的分析思路是 ...
- 全局最小割(Stoer-Wagner)
P5632 [模板]Stoer-Wagner算法 板子收集中 #include <bits/stdc++.h> #define inf 0x7fffffff #define ll long ...
最新文章
- MyEclipse连接MySQL时遇到的各种烦人事
- bzoj4033:[HAOI2015]树上染色
- echarts的x轴数量固定_联轴器 多节膜片式夹紧螺丝固定型 DAAPC(对应LK5CWP)
- 【渝粤题库】广东开放大学 形成性考核 - 副本 (17)
- 在Linux终端下调用可执行文件时总要加上符号./的原因
- 我想和iOS大牛们交流的问题
- Leetcode-952 Largest Component Size by Common Factor(按公因数计算最大组件大小)
- Ubuntu赋予普通用户特定目录权限
- mysql flush操作
- 关于get和post的区别
- 【腾讯TMQ】TBS主线众测实践之路
- 报错 AttributeError: ‘scipy.spatial.transform._rotation.Rotation‘ object has no attribute ‘as_dcm‘
- 微信公众请求config php,微信公众平台开发之配置与请求_PHP
- Arturia Buchla Easel V for Mac - Buchla音乐画架插件
- R中两种常用并行方法——2. snowfall
- 【包装类、自动装箱/自动拆箱】
- jQuery中ajax获取数据赋值给页面
- Outpost Firewall Pro
- win32汇编学习的一些摘要
- java基础入门txt下载地址_java基础入门-ZipOutputStream打包下载