網路流最大流(Edmonds Karp )

2021-08-21 07:15:46 字數 1481 閱讀 8502

根據定義,若一條從源點s到匯點t的路徑上各點的剩餘容量都大於0,則稱這條路徑為增廣路。那麼就可以通過不斷尋找增廣路來求出最大流。

具體做法就是通過bfs尋找從s到t的增廣路徑,並順便計算出最小剩餘容量minx,找到後路徑上各點減去minx,答案(最大流)加上minx。

需要注意的是,因為是單純的遍歷所有剩餘流量大於零的邊,所以無法保證當前所選的邊是否是最優,所以需要一種方法可以「後悔」,即撤回之前的決定,而這種「後悔」的方法就是退流,即在遍歷時除了考慮當前遍歷的邊以外,還需要考慮每條邊的反向邊。

具體實現時,我們按照鄰接表成對儲存技巧,在儲存邊時下標從2開始,那麼反向邊和邊之間可以通過xor 1來轉換。

**如下

#include

using namespace std;

int n,m,s,t,linkk[205],t=1;

intq[505],head,tail;

int before[205],minx[205];

long long ans=0;

struct nodee[405];

bool vis[205];

inline int

read()//快讀

void insert(int xx,int yy,int zz)//正反存邊

void init()

return;

}void up()

ans+=minx[m];

return;

}bool bfs()

} return0;}

void work()

int main()

由於edmonds-karp每次可能遍歷整個殘量網路,但只找出一條增廣路,明顯有很大的優化空間,所以就有了dinic。

與ek只能往父親反不同,dinic是基於分層圖的dfs,一次可以求出多條增廣路,同時加入若干剪枝,一般能夠處理10^4~10^5的網路。

**:

#include

using namespace std;

const int maxn=1e9;

int n,m,linkk[1005],t=1;

intq[2005],head,tail;

int dis[2005];

long long ans=0;

struct nodee[1000005];

inline int

read()

void insert(int xx,int yy,int zz)

void init()

return;

}int dinic(int

x,int flow,int fa)

} return flow-rest;

}bool bfs()

}} return0;}

void work()

int main()

網路流 最大流

網路流 題記 網路流是最近講過的最迷演算法 網路流 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 的流量。而對於一組具有源點和匯點,且總流出量 總流入量,則稱為網路中的一條可行流。拿例子來說 ...

網路流 最大流

dinic 最大流 head x 從0開始記 這樣便於找反向邊 異或即可 當前弧優化 include include include include include include include define ll long long define ull unsigned long long d...