學習筆記 網路流最大流

2022-09-13 06:57:08 字數 3048 閱讀 9457

使得整個網路的流量最大的流函式叫做最大流。舉個栗子,如圖 (太醜了太醜了)

邊權表示容量。

我們可以觀察到:

如果拆開了來看,

4-5-3-7這條增廣路最大流量是3,超過了相當於水管就爆了。

2-5-3-7這條增廣路最大流量是2,

2-10這條增廣路最大流量是2,

如果合併起來看的話,

發現4-5-3-7如果走了的話,那麼最大流量是3,那麼其他邊的剩餘流量就會減少,變成1-2-0-4,這樣的話,我們發現2-5-3-7這條路就不能走了。而2-10是可以走的,變成了0-8

這樣最大流就是3+2=5了。

但是如果我第一找找的是2-5-3-7呢,那麼剩餘的容量就是0-3-1-5了,那麼4-5-3-7只能流1,2-10不能走了,流量為3。明顯更少。

那麼這樣要怎麼辦呢?回溯嗎?不,我們更優美的方法解決。

我們對於每一條邊建上反邊,初始邊權為0。

沿增廣路同向邊增流w[i]-=flow,反向邊減流w[i^1]+=flow。

注意這裡使用了』 ^ '異或符,我們需要在建鄰接表時將下標從奇數開始tot=1或-1。

首先介紹ek的思路,每次bfs找增廣路,直至找不到了為止,時間複雜度o(nm2)。

**實現:

#include

using

namespace

std;

#define int long long

const

int n=

405,m=

1e4+5;

int n,m,s,t;

bool vis[n]

;int first[n]

,nex[m]

,to[m]

,w[m]

,tot=1;

struct

node

pre[n]

;void

add(

int x,

int y,

int z)

bool

bfs()

}}return0;

}int

ek() ans+=min;

//累計答案

}return ans;

}main()

cout<

);return0;

}

這裡主要介紹dinic演算法:

dinic思路是:首先bfs分層,分好層後不斷dfs找增廣路,並累計答案。時間複雜度o(n2m)。

#

include

using

namespace std;

#define

intlong

long

const

int n=

1e5+

5,m=

5e6+

5,inf=

1<<29;

int first[n]

,nex[m]

,to[m]

,w[m]

,tot=1;

int n,m,s,t,ans,dep[n]

;queue<

int>a;

void

add(

int x,

int y,

int z)

bool

bfs()}

}return0;

}int

dfs(

int x,

int flow)

//flow代表該增廣路的最大流量

}return flow-rest;

}signed

main()

int flow=0;

while

(bfs()

)//分層

while

(flow=

dfs(s,inf)

) ans+=flow;

//不斷dfs

//這裡的順序是先給flow賦值,再判斷是否是0或其他數

cout<

return0;

}

我們僅需要乙個now[m]陣列來記下邊,下次列舉直接從這個邊開始,但就這一點可以節省大量的時間。

**實現:和上面的大體相似,只需要增加幾行。

#include

using

namespace

std;

#define int long long

const

int n=

1e5+

5,m=

5e6+

5,inf=

1<<29;

int first[n]

,nex[m]

,to[m]

,w[m]

,tot=1;

int now[m]

,n,m,s,t,ans,dep[n]

;queue<

int>a;

void

add(

int x,

int y,

int z)

bool

bfs()

}}return0;

}int

dfs(int

x,int

flow)

} now[x]

=i;//記下結束的邊,下次直接搜

return flow-rest;

}signed

main()

int flow=0;

while

(bfs()

)while

(flow=

dfs(s,inf)

) ans+=flow;

cout<

return0;

}

計算最大流的基本dinic演算法就介紹完了。qw

網路流 最大流學習

ek演算法模板很好 最大流講解很好 一 什麼是網路流?什麼是最大流 最大流就是解決從源點到匯點的最大流量問題。二 網路流中的定義 術語 有相同g 中 滿足上述條件的圖g稱為網路流圖。記為g v,e,c 流量 流量是一條弧的實際流過的水量 通常用f u,v 表示 流量 一定不大於該弧的容量 f u,v...

網路流 最大流

網路流 題記 網路流是最近講過的最迷演算法 網路流 network flows 是一種模擬水流的解決問題方法,與線性規劃密切相關。非常重視選手在網路流上的建模技巧,畫圖是非常關鍵的。1 最大流 問題引入 有n條溝渠,與水坑s t相連,匯聚成m個點,第i條溝渠的水流的流量為c i 每乙個點的流入量和流...

網路流(最大流)

我們圍繞一道題來講解吧 藍橋杯 演算法訓練 網路流裸題 首先,何為網路流最大流問題?可行流 對於每條路線 u,v 上給定乙個實數f u,v 滿足 0 f u,v c u,v 則稱f u,v 為路線 u,v 的流量。而對於一組具有源點和匯點,且總流出量 總流入量,則稱為網路中的一條可行流。拿例子來說 ...