真是不知道該說些什麼呀……
感覺這是我見到過的網上敘述最最最詳細的乙個演算法了。(可見我才學過幾個演算法qwq……)
我並不認為我能比網上講的要好……
所以……emmm……
我就打算解釋一下》\\\<(不要管這迷一樣的邏輯)
(先去看看題解hhh)
咳咳……
(等會兒……)
好了好了(qwq)……
言歸正傳:
這裡的dinic演算法,是對edmonds-karp演算法的乙個優化 ,複雜度嘛……手推是o(n2 * m)。
對於要連反向邊的原因,就是:
我們知道,當我們在尋找增廣路的時候,在前面找出的不一定是最優解,如果我們在減去殘量網路中正向邊的同時將相對應的反向邊加上對應的值,我們就相當於可以反悔從這條邊流過。
比如說我們現在選擇從u流向v一些流量,但是我們後面發現,如果有另外的流量從p流向v,而原來u流過來的流量可以從u->q流走,這樣就可以增加總流量,其效果就相當於p->v->u->q。
通俗點說,就是:
反向邊就相當於把用了的流量(減去多少)給退了回去(反向邊就加多少),這樣可以給程式乙個後悔的機會,去選擇乙個更有的解。
對於反向邊的儲存:
我們可以發現:1^1=0;0^1=1;2^1=3;3^1=2;
所以如果我們從0開始存邊的話,那麼x^1便可以表示反向邊。(所以head,nxt要改啊)……
接下來上**:
#include#include#include
#include
using
namespace
std;
const
int maxn=1e6+5
;const
int inf=1e9;
struct
node
edge[maxn];
inthead[maxn],dep[maxn];
int n,m,s,t,cnt=-1
;void add(int a,int b,int
z)int
bfs()}}
if(!dep[t]) return0;
else
return1;
}int dfs(int u,int
dist)}}
return0;
}int
dinic()
intmain()
printf("%d
",dinic());
return0;
}
最小割最大流記錄
經過一系列的學習,明白了一些東西記錄一下備忘 割 是指刪除一些邊,使剩下的網路中沒有增光路,那麼可以得出max flow c s,t 割 為什麼呢?首先我們明白知道最大流一定是根據增光路得到i的,那麼割就是包含增光路的乙個集合,那麼sum c s,t 一定是在在這個 基礎上得到的,也就是割中一定包含...
最大流 最小割定理
割 cut 是網路中頂點的劃分,它把網路中的所有頂點劃分成兩個頂點的集合源點s和匯點t。記為cut s,t 如下圖 源點 s 1 匯點 t 5。框外是容量,框內是流量 如下圖是乙個圖的割。頂點集合s 和t 構成乙個割。如果一條弧的兩個頂點分別屬於頂點集s和t那麼這條弧稱為割cut s,t 的一條割邊...
最大流最小割定理
在最優化理論中,最大流最小割定理提供了對於乙個網路流,從源點到目標點的最大的流量等於最小割的每一條邊的和。即對於乙個如果移除其中任何一邊就會斷開源點和目標點的邊的集合的邊的容量的總和。最大流最小割定理是線性規劃中的雙對問題的一種特殊情況,並且可以用來推導menger定理和k nig egerv ry...