Dinic

Dinic


dinic 求最大流。

先引入兩個概念:層次圖、阻塞流。

層次圖

根據每個點到源點的距離(到達源點最少要經過的邊的數量),將點分層。

如圖:

無標題

若level[s]=1,則各點上的數字就是該點的level。

一個bfs就行了。

不難發現,當層次圖中不含有匯點時,就說明沒有流可以流了。

阻塞流

就是一條不考慮反向邊的極大流,每次流完一條阻塞流就一定會去掉一條邊。

然後dinic就是先bfs建個層次圖,然後dfs一層一層傳流量。

爲什麼要這樣?

原因

時間少啊!!!

首先,建層次圖可以判斷是否存在增廣路。

其次,每次增廣時間均不大於點數(層數最多就那麼多)。

然後,dinic每次增廣都可以將其中某一層連向下一層的邊都流滿,所以最多建N 次層次圖。

最後,dinic還可以進行當前弧優化,進一步壓縮時間。

當前弧優化

在一次DFS中,當某個點所有流出的邊都滿了,就不要再流這個點了。

具體細節看題解代碼:)

例題:POJ1273(這裏題解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章