Edmonds Karp演算法,網路流最大流

2021-07-09 18:21:51 字數 1499 閱讀 7734

網路流是一種生活中常見的圖模型,包含乙個起始點,和乙個匯點,以及若干結點,用有向邊連線,每條邊的權值代表能流經該邊的最大流量。生活中,水流網路,電流網路,資訊網路這些問題都能描述成網路流。網路流中一種常見的問題是最大流問題。即求從起始點到達匯點流的最大值。在《演算法導論》介紹了edmonds-karp演算法,該演算法執行時間在圖g=(v,e)上為o(ve),基於bfs實現。

實現過程是從殘存網路中找到一條最短的增廣路徑,對路徑上的邊做增廣操作,並改變一些資料,直到殘存網路中不在存在增廣路徑。

殘存網路簡單來講就是在每次增加操作結束後得到的網路,原本在網路流中不允許出現平行反向的邊(若map[u][v]為網路流中的一條邊,那麼網路流中必然不存在map[v][u],map[v][u]為map[u][v]的平行反向邊,畫圖的話會很好理解)。但是在殘存網路中需要加入反向平行邊(如果有必要)。每條邊的權值表示可通過該邊的流量,那麼在殘存網路中,反向平行邊的權值代表的是原本已經流過該邊的流量。例如:f[u][v]=x代表已經流過該邊的流量,那麼,map[v][u]的權值就為f[u][v]。可以看出,未做任何操作的流網路也是乙個殘存網路。

增廣路徑就是在殘存網路中可以從起始點走到匯點(想了一下,可能叫目標點會更好理解?)的一條簡單路徑。如圖,1-->2-->4-->6為一條增廣路徑。

接下來就是每次找到增廣路徑以後對路徑上每條邊做處理了c[u][v]代表邊uàv的能通過的最大流量或者叫做容量。首先需要找到該路徑的增加流量,該流量值為該路徑上所有邊中殘存流量的最小值,這是保證可以通過該路徑的最大流量值。接下來需要縮減通過該邊的容量,同時需要增加平行反向邊的容量。記增加流量為p,那麼u-->v為該路徑上的邊。c[u][v]-=p;c[v][u]+=p。

按照這樣的操作直到不存在增廣路徑。

#include#include#include#includeusing namespace std;

int path[1000005],flow[1000005];

int map[1005][1005],que[1000005];

int n,m;

int bfs(int start,int des)

path[start]=0;

flow[start]=0x3f3f3f3f;

head=tail=0;

que[head++]=start;

while (head>tail)}}

if (path[des]==-1)

return -1;

return flow[des];

}int maxflow(int start,int des)

sum+=increase;

}return sum;

}int main()

cin>>start>>end;

int ans=maxflow(start,end);

cout<

Edmonds Karp演算法 網路流 最大流問題

可行流 即多條弧的集合,且每條弧的流量為非負的,且不超過該弧的容量 流入原點的流量等於流出終點的流量。最大流 即網路中的流量最大的可行流。最大流的求法 即由原網路得到殘量網路,再找到殘量網路中的增廣路,根據增廣路求最大流。步驟 1.找到殘量網路中的一條增廣路。2.求出該增廣路上的最小的流量值,使各個...

網路流 最大流 Edmonds Karp演算法

edmonds karp演算法,複雜度o ve 2 思想就是找增廣路,不斷增加流量。在殘量 每條邊上流量和容量的差 圖上找一條每個邊權值都為正的路 可以通過bfs,比dfs效率高 這些邊權值裡的最小值就是這條路可以增加的流量,然後在這條路徑上更新流量。再重複找這樣的路更新流量,直到找不到這樣的路了就...

網路流EdmondsKarp演算法模板理解

先推薦乙個講網路流的部落格,我的網路流知識均吸收於此 傳送門 edmondskarp演算法基本思想 從起點到終點進行bfs,只要存在路,說明存在增廣路徑,則取這部分路 權值最小的一部分,即為增廣路徑 也就是這一部分路的最大流量 然後將這條路上的正向權值都減去min,反向權值都加上min 即,m i ...