借鑑:
提到無向圖的最小割問題,首先想到的就是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即可得出答案 最小割邊一定是滿流的。給定乙個圖,求有多少邊增大流量可以使得從源點到匯點流量增大 其實就是求最小割的割邊是那些。我們先求一次網路流,之後在殘餘圖的基礎上...