網路最大流 Dinic

2021-08-13 23:24:06 字數 2183 閱讀 6256

dinic求最大流分為兩步

bfs構造層次圖

dfs尋找增廣路

字面理解,其實就是給圖分層

源點為第0層

源點出發最少只要一步可以到達的就是第1層

最少兩步到達的是第二層

依次類推直到匯點

如下圖所示

在網路流中

求取層次圖需要先判斷該邊是否有剩餘容量

若層次圖可以延伸到匯點

則說明最大流還可以增加

bool

bfs()}

}return

false

;}

沿著層次圖的順序殘量網路上dfs找到一條從源點到匯點的路徑成為增廣路

但是什麼是殘量網路

我們找到一條增廣路

這條路徑上所有邊的容量都減去這條增廣路上的最小容量

就得到了乙個殘量網路

我們要做的就是不斷構造層次圖與殘量網路

直到匯點不可達

int

dfs(

int u,

int cap)

}return cap-flow;

//返回這一層的流量

}

一次完整的過程如下圖

第四次增廣後

紅色邊上的容量都-4

層次圖不能再延伸到匯點,演算法結束

完整的**

洛谷p3376 【模板】網路最大流

#include

#include

#include

#include

#include

using

namespace std;

intread()

while

(ss>=

'0'&&ss<=

'9')

return f*x;

}const

int inf=

1000000000

;int n,m;

int s,t;

struct nodee[

1000010];

int head[

1000010

],tot=1;

int lev[

1000010];

int maxf;

void

add(

int u,

int v,

int f)

bool

bfs()}

}return

false;}

intdfs

(int u,

int cap)

}return cap-flow;

}int

main()

while

(bfs()

) maxf+

=dfs

(s,inf)

;

cout<

return0;

}

網路最大流 Dinic

存圖方式 鄰接表,鄰接矩陣 圖的遍歷 dfs,bfs 我們舉個例子吧 有乙個毒瘤水管工,他會造水管,有一天他造了乙個水管網路,就像乙個圖。其中有乙個點只有出邊,就是起點,還有乙個點只有入邊,是終點。點之間有一些管子,這些管子都有單位時間內的容量,現在毒瘤水管工想知道,他的管子在單位時間裡在起點終點之...

網路最大流Dinic

1.什麼是網路最大流 形象的來說,網路最大流其實就是這樣乙個生活化的問題 現在有乙個由許多水管組成的水流系統,每一根管道都有自己的最大通過水流限制 流量 超過這個限制水管會爆 你麻麻就會來找你喝茶qwq 現在,給定你乙個出水口 原點 乙個出水口 匯點 求這個網路中水流量的最大值。看起來很簡單對不對?...

網路流最大流 Dinic演算法

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