用於計算最大流,帶有當前弧優化
下面是對演算法的簡明概述:
首先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 問題描述 乙個工廠每天生產若干商品,需運輸到銷售部門進行銷售。從產地到銷地要經過某些城鎮,有不同的路線可以行走,每條兩城鎮間的公路都有一定的流量限制。請你計算,在不...