網路流Dinic演算法

2022-06-02 05:00:17 字數 1188 閱讀 6687

我的模板

例題: 

struct

edge

edge (

int llst, int ffrom, int tto, int ccap, int fflow) : lst(llst), from(from

), to(tto), cap(ccap), flow(fflow)

};//

dinic 演算法有3個重點:

//乙個是 層次圖

//乙個是 阻塞流

//乙個是 cur優化

//稠密點的可以再加上 炸點優化

class

dinic

void add(int u, int v, int

c)

//bfs劃 層次圖

bool

bfs() }}

return vis[ced]; //

說明不能到達匯點

}

//dfs收割阻塞流

int dfs(int u, int

limit)

}if (!flow) dist[u] = -1; //

這個第二個優化:炸點優化,說明這個點沒有貢獻了,再經過他也沒有任何意義了,所以距離定義為-1.

return

flow;

}//不斷分割層次圖,每一次分割後就收割一次阻塞流,直到不能再分割層次圖

int maxflow(int st, int

ed)

return

res;

} }dic;

紫書模板

struct

edge

};

struct

dinic

inline

void add(int u, int v , int

val)

bool

bfs() }}

return

vis[t];

}int dfs(int x, int

a) }

return

flow;

}int maxflow(int s, int

t)

return

flow;

}}dic;

網路流dinic演算法

遇到過不少網路流的題目,直接找增廣路徑的方法時間複雜度實在受不了。常面臨tle的問題。通過學習這個dinic演算法,不僅 短,效率也高。該演算法的重點在於乙個層次圖,是在普通增廣的方法上加了優化,普通的增廣是每次在圖上四處遊蕩,直到找到匯點為止。dinic演算法就是把每個點都給乙個等級level l...

Dinic快速網路流演算法

edmonds karp演算法,每進行一次增廣,都要做一遍bfs。如果能少做幾次bfs,即可提高效率,dinic演算法可以減少bfs次數。dinic演算法的關鍵 在一次增廣的過程中,尋找多條增廣路徑。使用dfs 先利用bfs對殘餘網路 包括原網路 分層 乙個節點的 層 數,就是源點到它最少要經過的邊...

網路流之Dinic演算法

初學網路流。存一下dinic板子。複雜度o n 2 m uva 1515 pool construction 把每個草地與 s 相連,花費為dig,每個洞與 t 相連,花費為 然後對於每個兩個相鄰的點連一條權值為 build 的邊。求最小割,就是把草和洞分開的花費。因為只有三種割的情況 割s與草之間...