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開始...