dinic演算法模板

2021-09-13 11:43:08 字數 1458 閱讀 1968

用於計算最大流,帶有當前弧優化

下面是對演算法的簡明概述:

首先dinic演算法屬於增廣路演算法,通過不斷尋找從源點到匯點的增廣路來實現擴流,但想較之ford-fulkerson演算法來說,dinic在尋找增廣路之前,將原圖進行分層處理,即 以源點為深度為零的點,不斷向下按照深度將原圖的點標記;並且永遠尋找最短的增廣路來進行優化。因為最短的增廣路在增廣的過程中永遠不會變短。

之後是**實現:

接著是函式的說明

當前弧優化為 避免在尋找增廣路的過程中對一條已知沒用的邊反覆搜尋。

在同一分層圖中,可能會重複多次dfs。假設 在一次搜尋過程中,到達節點 v ,並選擇了邊 adj[v][k] 。之後在下一次搜尋中,有到達了節點 v ,那麼我們可以根據上一次到達這個節點的搜尋結果知道,對於任意的 i在dinic主體中改動

memset(cur,0,sizeof(cur));

while(d=dfs(starnode,finishnode,inf),d>0)

sum+=d;

完整**如下:

#include #include #include #include #include #include #include #define maxn

#define starnode 0

#define finishnode

#define inf 0x3f3f3f3f

#define ll long long

#define re return

#define getlen(name,index) name[index].size()

#define mem(a,b) memset(a,b,sizeof(a));

#define rep(index,star,finish) for(register int index=star;index=star;index--)

using namespace std;

struct edge;

int cur[maxn];

int level[maxn];

vectoradj[maxn];

inline void addedge(int star,int finish,int cap);

int dinic();

void bfs();

int dfs(int star,int finish,int f);

int main()

inline void addedge(int star,int finish,int cap));

adj[finish].push_back((edge));

}int dinic()

}re sum;

}void bfs()}}

}int dfs(int star,int finish,int f)}}

re -1;

}

Dinic演算法模板

沒什麼好說的,建議直接背過。dinic的複雜度就是個笑話,跟放p一樣 看似 o n 2m 實則艹過 n 10 5,m 10 6 include using namespace std typedef long long ll const int n 1e4 10,m 2e5 10,inf 1e8 i...

dinic 演算法 基本思想及其模板

網路流博大精深 sideman語 乙個基本的網路流問題 感謝whd的大力支援 最早知道網路流的內容便是最大流問題,最大流問題很好理解 解釋一定要通俗 如右圖所示,有乙個管道系統,節點,有向管道,即有向圖一張.1 是源點,有無限的水量,4 是匯點,管道容量如圖所示.試問 4 點最大可接收的水的流量?這...

最大流dinic模板

運輸問題1 輸入檔案 maxflowa.in 輸出檔案 maxflowa.out 簡單對比 時間限制 1 s 記憶體限制 128 mb 問題描述 乙個工廠每天生產若干商品,需運輸到銷售部門進行銷售。從產地到銷地要經過某些城鎮,有不同的路線可以行走,每條兩城鎮間的公路都有一定的流量限制。請你計算,在不...