Dinic演算法解最大流問題

2021-10-10 21:54:48 字數 1098 閱讀 2920

具體的最大流的定義及原理可以參見這位朋友的部落格(簡單易懂)

最大流問題詳解(侵刪)

dinic演算法的基本原理

利用bfs對圖進行分層處理,接著使用dfs從s開始,每次層次加一尋找下乙個點,直至達到匯點t,然後再回溯回去,以此遍歷所有的增廣路徑,這樣就可以滿足我們同時求出多條增廣路的需求,效率更高

因此可給出dinic演算法的進行框架

①在殘量網路上通過bfs求出結點的層次,構造分成圖。

②在分層圖上通過dfs尋找增廣路,在回溯時同時更新邊權。

更加具體的原理可以參見這位朋友的部落格

**網路最大流 (侵刪)

**部分

下面給出帶有注釋的**(**為借鑑上述部落格中**並增添詳細解釋)

#include

using

namespace std;

const

long

long inf=

2225020666

;int n,m,s,t,u,v;

long

long w,ans,dis[

1005000];

int tot =

1, now[

1005000

], head[

1005000];

/*dis陣列用以設定每個點的層數,head陣列用以構造圖,now陣列用以當前弧優化*/

struct node e[

1005000];

void

add(

int u,

int v,

long

long w)

intbfs()

}}return0;

//隊空返回0,結束dfs遍歷

}int

dfs(

int x,

long

long sum)

}return res;

}int

main()

while

(bfs()

)printf

("%lld"

,ans)

;return0;

}

最大流 Dinic演算法

ford fulkerson演算法是通過深度優先搜尋尋找增廣路,並沿著它增廣。與之相對,dinic演算法總是尋找最短的增廣路,並沿著它增廣。因為最短增廣路的長度在增廣過程中始終不會變短,所以無需每次都通過寬度預先搜尋來尋找最短增廣路。我們可以先進行一次寬度優先搜尋,然後考慮由進距離頂點指向遠距離頂點...

Dinic演算法求最大流

include using namespace std const int oo 1e9 無窮大 const int maxm 111111 邊的最大數量,為原圖的兩倍 const int maxn 999 點的最大數量 int node,src,dest,edge node節點數,src源點,de...

最大流模版Dinic演算法

網路流的演算法有很多,最基礎的為ek演算法,他的時間複雜度為o n m 2 dinic演算法的時間複雜為o m n 2 dinic演算法是現構造層次圖,然後用阻塞流來增廣。構造層次圖有乙個bfs,增廣是用dfs來寫。詳細的講述請參考 劉汝佳寫的 演算法競賽入門經典訓練指南 大白書 include i...