流網路g(v,e)是乙個有向圖,其中每條邊( u, v )∈e 均有一非負容量 c( u, v ) ≥ 0,規定:若 u , v ∉e,則 c( u, v ) = 0。
網路中由兩個特殊點: 源點s和匯點t
網路中的邊相當於是粗細不同的水管,c( u, v ) 相當於是水管的直徑。
流網路g的流是乙個實值函式 f : v×v -> r,且滿足下列三個性質:
(1)容量限制:對於∀u
,v∈v
,要求f
(u,v
)≤c(
u,v)
。 (2) 反對稱性:對於∀u
,v∈v
,要求f
(u,v
)=−f
(v,u
) 。
(3) 流守恆性:對於∀u
,v∈v
−s,t
,要求∑
f(u,
v)=0
。最大流最小割定理:最小割的容量等於最大流
割:割是乙個邊集,去掉這個邊集會使得s到不了t。
最小割:邊集容量最小的割。
殘留容量:不超過容量限制下,某條邊還能通過的額外的網路流量:cf
(u,v
)=c(
u,v)
−f(u
,v)
殘留網路:可以理解成由可以容納更多流的邊組成的網路,起始網路也是一張殘留網路。
增廣路徑:一條從源點到匯點的路徑,要求該路徑上每條邊的殘留容量均大於0。這條路徑上可以增加的最大流量為所有邊的殘留容量中的最小值。
定理:如果
f 是具有源點s和匯點t的流網路(v
,e)中的乙個流,則下列條件是等價的:
(1)f
是 g的乙個最大流
(2) 殘留網路
g 不包含增廣路徑
(3) 對
g的某個割,有|f
|=c(
u,v)
幾種求最大流最小割的演算法:ed
mond
skar
p : 先在殘留網路上進行bfs,找出一條增廣路徑,沿著增廣路徑進行增廣,找出路徑上的最大流f,即最小的殘留容量。再更新殘留網路,對於每條路徑上的邊(u
,v) ,f(
u,v)
+=f ,cf
(v,u
)+=f
並且還有 f(
v,u)
−=f ,cf
(v,u
)+=f
,後兩個式子保證流的守恆性,也給了系統糾正錯誤的機會。不斷重複這兩個過程,當無法找到增廣路徑時,最大流就找到了。di
nic :因為ed
mond
skar
p 演算法中的bfs一次只增廣一條增廣路,時間上很浪費,所以di
nic 演算法再前者基礎上進行了改進,在bfs時。給每個節點加上乙個距離標號,表示與源點s的距離,在找增廣路時只需沿著距離標號遞增的順序即可。相當於dfs,多次增廣。is
ap:isap在dinic的基礎上多了乙個gap優化,gap[i]記錄標號為i的點的個數,當網路出現斷層即gap[i] == 0時,說明以及不存在增廣路,也就找到了最大流。
預留推進(p
ush−
rela
ble)
演算法:
網路流基礎
給定指定的乙個有向圖,其中有兩個特殊的源點s和匯點t,每條邊有指定的容量,求滿足條件的從s到t的最大流。殘量網路 容量網路 流量網路 概念就不講了吧,顧名思義。增廣路 設 f 是乙個容量網路 g 中的乙個可行流,p 是從 vs 到 vt 的一條鏈,若 p 滿足下列條件 則稱 p 為關於可行流 f 的...
網路流學習記錄
文章更新中 費用流 再不冒個泡我都以為我退役了 luogup3376最大流模板 關於網路流的講解其實網上很多,具體的這裡就不再多說了,就說幾點新學網路流要注意的地方吧 cnt要賦上初值,要麼為 1,要麼為1,這樣它是從2或者0開始的,保證了每次異或後的兩個邊是對應的 大部分情況下,盡量使用dinic...
網路流學習筆記
先宣告,來自網路,寫得也比較亂,如果有任何問題可以聯絡博主。首先,我們來理解下網路流。在乙個有向圖上選擇乙個源點,乙個匯點,每一條邊上都有乙個流量上限 以下稱為容量 即經過這條邊的流量不能超過這個上界,同時,除源點和匯點外,所有點的入流和出流都相等,而源點只有流出的流,匯點只有匯入的流。這樣的圖叫做...