全域性最小割Stoer Wagner演算法

2022-06-11 01:15:12 字數 2282 閱讀 1896

借鑑:

提到無向圖的最小割問題,首先想到的就是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 #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define rap(i, a, n) for(int i=a; i<=n; i++)

#define rep(i, a, n) for(int i=a; 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#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;

intway[maxn][maxn], d[maxn], bin[maxn];

bool

vis[maxn];

int contract(int &s, int &t)

return

ans;

}int

sw()

return

mincut;

}int

main()

cout

<< sw() <}

return0;

}

Stoer Wagner演算法(全域性最小割)

題解 全域性最小割stoer wagner演算法 附上 關於證明 的證明寫得非常詳細,在此不再贅述 關於時間複雜度 最大鄰接搜尋是來求任意非固定兩點的最小割,做完一次最大鄰接搜尋之後還要縮點重做,直到全圖只剩乙個點 所以使用堆優化的複雜度大概是o n 2logn 關於實現 初寫stoer wagne...

全域性最小割stoer wagner c 模板

include using namespace std define maxn 110 int graph maxn maxn int v maxn i為結點初始編號,v i 為結點當前編號,便於刪除結點並使序號始終連續 int wage maxn 該點加入之前集合中的所有頂點到該點的邊權之和 bo...

最小割問題

求最小割邊數 把第一遍dinic之後把網路中滿流量 殘量為0 的邊的殘量改為1,其餘的邊殘量改為無窮大,不含反向邊。再跑一次dinic即可得出答案 最小割邊一定是滿流的。給定乙個圖,求有多少邊增大流量可以使得從源點到匯點流量增大 其實就是求最小割的割邊是那些。我們先求一次網路流,之後在殘餘圖的基礎上...