網路流dinic演算法

2021-06-16 22:54:03 字數 1028 閱讀 4565

遇到過不少網路流的題目,直接找增廣路徑的方法時間複雜度實在受不了。常面臨tle的問題。通過學習這個dinic演算法,不僅**短,效率也高。

該演算法的重點在於乙個層次圖,是在普通增廣的方法上加了優化,普通的增廣是每次在圖上四處遊蕩,直到找到匯點為止。dinic演算法就是把每個點都給乙個等級level(level(i)是點i到源點的最近距離),把它們分在不同的層次之中,對於點u,v只有滿足level(v) = level(u) + 1,才能通過。有了層次以後,就可以用一次深度搜尋找出所有的流,找到匯點後並不是退回到源點。dinic的效率就體現在這裡。時間複雜度o(n * n * m),在實踐效果中一般效率很高。

這裡描述一下整體框架:

1.算出層次圖,如果找不到匯點,就結束演算法;

2.一次深度搜尋找增廣;

3.回到步驟1。

對於具體的實現,我覺得用直接深度比較好,因為棧模擬**容易出錯,並且一般網路流的題結點數不會太多,深搜也不會棧溢位。

還可以加上乙個pre陣列,避免無用邊的迴圈,提高速度。

#include #include #include using namespace std;

const int n = 207;

const int m = 207;

int n, m, nedge;

int from[n], to[m << 1], next[m << 1], cap[m << 1];

int pre[n];

void insert(int a, int b, int c)

void init()

}int lev[n], q[n];

bool bfs()

} }return false;

}// u是當前結點,flow是流量

int dfs(int u, int flow)

} }return flow - rest;

}int main()

printf("%d\n", ans);

} return 0;

}

網路流Dinic演算法

我的模板 例題 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個重點 乙個是 層次圖 乙個是 阻塞流 乙個...

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與草之間...