網路流 最大流 Dinic演算法的初步認識

2021-10-10 01:50:22 字數 1715 閱讀 8388

@[網路流——最大流——dinic演算法的初步認識]

!!!!!!!目前部落格轉移 !!!

簡單說一說:有乙個起點(源點),和乙個終點(匯點),它們之間用很多直徑大小不一的管子連在一起,為什麼要用大小不一的管子,(假如這些都是水管),那麼你要做的就是:算出從源點到匯點最大可以流入多少水。

顯然,對於一條路上,它的最大流是這條路上直徑最小的管子所能承受的水量(再多的話,那最小的水管就爆了)。 於是乎,直徑最小的水管就被佔滿了——不能再有更多的水從這裡通過,而直徑比它大的管子還沒被佔滿——所以他們還可以再讓更多的水通過。

大概就這麼個意思_如下圖

最後,把所有到達匯點的水量加起來就行了。

直接上**!!!

#include

using

namespace std;

const

int inf=

0xfffffff

;const

int maxn=

5200199

;int s,t,n,m;

int tot=1;

int first[maxn]

;int dep[maxn]

;struct node

;node edge[maxn*2]

;void

add(

int u,

int v,

int w)

bool

bfs(

)//建立分層圖,每次dfs就是在最新的分層圖的基礎上進行的 }}

return dep[t]!=-

1;}int

dfs(

int u,

int flow)

//以u記錄當前編號,flow記錄目前的最大流

int delta=flow;

// !!重點,以delta記錄 向下傳遞的最大流 與 實際接收的最大流 的差。 -->其實就是inf與最後答案的差

for(

int i=first[u]

;i;i=edge[i]

.next)

edge[i]

.v-=sum;

edge[i^1]

.v+=sum;

//正向和反向邊處理

delta-

=sum;

//看圖 if(

!delta)}}

return flow-delta;//}

intread()

if(c==

'-')

while

(c>=

'0'&& c<=

'9')

return f*k;

}int main (

)long

long ans=0;

while

(bfs()

) ans+

=dfs

(s,inf)

;printf

("%lld\n"

,ans)

;return0;

}

其實delta就是陰影部分,最後答案就是最上面一層(flow)減去陰影(delta)

還有乙個小問題,據說當前弧優化有時會出問題?(我們老師說的) 哪位大佬能幫忙解解惑呀

網路流最大流 Dinic演算法

o n 2 m 的演算法 比ek的o n m 2 優很多 ek通常解決10 3 10 4規模的網路 而dinic能解決10 4 10 5的網路 dinic演算法的思想也是分階段地在層次網路中增廣。它與最短增廣路演算法不同之處是 最短增廣路每個階段執行完一次bfs增廣後,要重新啟動bfs從源點vs開始...

網路流 最大流Dinic演算法

突然發現到了新的一年什麼東西好像就都不會了涼涼 建殘量網路圖 在殘量網路圖上跑增廣路 重複1直到沒有增廣路 注意乙個殘量網路圖要盡量把價值都用完,不然會浪費建圖的時間 include include include include include include include include in...

網路流 最大流之Dinic演算法

網路流主要解決三種問題 最大流 最小流和費用流。最大流演算法主要有三種 ek演算法 dinic演算法 sap演算法。本篇部落格是關於dinic演算法的。最壞的情況下,dinic演算法將達到複雜度o v e2 o v2e 1 include 2 include 3 include 4 include ...