網路流 Dinic 自用,勿看

2022-05-21 19:18:15 字數 1225 閱讀 1015

注意:這是一篇個人學習筆記,如果有人因為某些原因點了進來並且要看一下,請一定謹慎地閱讀,因為可能存在各種奇怪的錯誤,如果有人發現錯誤請指出謝謝!

來自藍書:

時間複雜度o(n^2*m)

所有容量均為1,可以證明時間複雜度o(min(n^(2/3),m^(1/2))*m)

除了源點和匯點之外,每個點要麼只有一條入弧,且容量為1,要麼只有一條出弧,且容量為1,其他弧的容量為任意整數,可以證明時間複雜度o(n^(1/2)*m)

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7#define fi first

8#define se second

9#define mp make_pair

10#define pb push_back

11 typedef long

long

ll;12 typedef unsigned long

long

ull;

13 typedef pairpii;

14namespacef15

e[200100

];21

int f1[10100],ne=1;22

ints,t,n;

23int d[10100

];24

bool

bfs()

2540}41

//return 0;

42return

d[t];43}

44int cur[10100

];45

int dfs(int u,int

x)46

56return

flow;57}

58int

solve()

5966

return

flow;67}

68void me(int a,int b,int

c)69

7576}77

intn,m;

78int

main()

7987 printf("%d"

,f::solve());

88return0;

89 }

view code

(補上37行,42行改成41行,跑的要更快,但是感覺不太對所以沒有寫)

網路流dinic演算法

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

模板 網路流 Dinic

const int maxn 207,inf 0x3f3f3f3f int n,m n個點,m條邊 int mp maxn maxn 鄰接矩陣 int que maxn maxn head,tail bfs佇列 首,尾 int dist maxn 距源點距離,分層圖 int ans bfs查詢是否連...

模板 網路流 dinic

題目描述輸入 輸入包括幾種情況。對於每一種情況,第一行包含兩個空間分離的整數,n 0 n 200 和m 2 m 200 n是農民約翰挖溝的數量。m是那些溝渠的交叉點。十字路口1是池塘。交叉點m是流。以下n行中的每乙個包含三個整數,si 穎娃和ci。si和ei 1 si,ei m 表示該溝之間的交匯點...