借鉴: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…)提出了非常著名的基于随机化的全局最小割算法,算法非常简单,简单到不敢相信它是正确的,算法描述如下:

  1. 在图中随机取一条边,将边的两个端点合并(contraction),同时消除所有由于合并而形成自环的边

Contraction

  1. 重复步骤1直到图中仅剩下两个点
  2. 将最终两点之间的边作为找的割返回

合并的边权值相加

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算法相关推荐

  1. 【HDU - 3002】King of Destruction(无向图全局最小割,SW算法,模板题)

    题干: Zhou xingxing is the successor of one style of kung fu called "Karate Kid".he is falli ...

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

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

  3. 【HDU - 6081】度度熊的王国战略(SW算法,全局最小割)

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

  4. POJ - 2914 Minimum Cut(全局最小割-Stoer_Wagner)

    题目链接:点击查看 题目大意:给出一张无向图,要求将其分为两个集合,使得最小割最小 题目分析:算法学习自:https://blog.csdn.net/dingdi3021/article/detail ...

  5. Stoer-Wagner无向图全局最小割(hduoj 3691 Nubulsa Expo)

    题意: 一张n个点m条边的无向图,每个点都有一个最大流量,给定起点S,问如何选取终点T,使得最大流最大 翻译一下: 一张n个点m条边的无向联通图,你要割掉一些边使整张图不连通,但是割掉每条边都需要一定 ...

  6. 最大流最小割经典例题_最大流, 最小割问题及算法实现

    本博客采用创作共用版权协议, 要求署名.非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议. 由于博文中包含一些LaTex格式数学公式, 在简书中显示不好, 所以 ...

  7. 基于最小割的分割算法(Min-Cut Based Segmentation)

    参考: https://www.cnblogs.com/ironstark/p/5008258.html https://github.com/Ewenwan/MVision/blob/master/ ...

  8. 最小割(Stoer-Wagner算法)

    Stoer-Wagner算法 简介: 割:在一个图G(V,E)中V是点集,E是边集.在E中去掉一个边集C使得G(V,E-C)不连通,C就是图G(V,E)的一个割: 最小割:在G(V,E)的所有割中,边 ...

  9. 最小割(min cut)算法

    0引言 图像分割可以看作不同的划分问题,而图可以进行不同的划分,将图像映射为图后,分割问题就可以用图论方法(如:最小割)求解.这只是直观地解释,具体如何将图像分割转化为求图的最小割呢?本文的分析思路是 ...

  10. 全局最小割(Stoer-Wagner)

    P5632 [模板]Stoer-Wagner算法 板子收集中 #include <bits/stdc++.h> #define inf 0x7fffffff #define ll long ...

最新文章

  1. MyEclipse连接MySQL时遇到的各种烦人事
  2. bzoj4033:[HAOI2015]树上染色
  3. echarts的x轴数量固定_联轴器 多节膜片式夹紧螺丝固定型 DAAPC(对应LK5CWP)
  4. 【渝粤题库】广东开放大学 形成性考核 - 副本 (17)
  5. 在Linux终端下调用可执行文件时总要加上符号./的原因
  6. 我想和iOS大牛们交流的问题
  7. Leetcode-952 Largest Component Size by Common Factor(按公因数计算最大组件大小)
  8. Ubuntu赋予普通用户特定目录权限
  9. mysql flush操作
  10. 关于get和post的区别
  11. 【腾讯TMQ】TBS主线众测实践之路
  12. 报错 AttributeError: ‘scipy.spatial.transform._rotation.Rotation‘ object has no attribute ‘as_dcm‘
  13. 微信公众请求config php,微信公众平台开发之配置与请求_PHP
  14. Arturia Buchla Easel V for Mac - Buchla音乐画架插件
  15. R中两种常用并行方法——2. snowfall
  16. 【包装类、自动装箱/自动拆箱】
  17. jQuery中ajax获取数据赋值给页面
  18. Outpost Firewall Pro
  19. win32汇编学习的一些摘要
  20. java基础入门txt下载地址_java基础入门-ZipOutputStream打包下载

热门文章

  1. 带你认识不一样的Stream,Java8就该这么玩!
  2. 听说你在生产环境下还没关闭Swagger2,算你猛
  3. 日处理20亿数据,实时用户行为服务系统架构实践
  4. 小米网技术架构变迁实践
  5. Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round)
  6. JavaScript中对象的属性:如何遍历属性
  7. XTU 2016上学期《程序设计实践》练习-1 题解
  8. 【Linux】解决Wesnoth中文乱码问题
  9. 机器学习实战——k-邻近算法:约会网站
  10. 得到页面中的所有链接函数