網路流求最大流演算法

2022-08-20 18:15:10 字數 1420 閱讀 2772

一、網路流的定義:有向圖g=(v,e)中,點集中有一源點s,一匯點t。且s入度為0,t出度為0。對於每條邊edge,都有一權值函式c,表示其容量,一權值函式f,表示其實際流量。

滿足對於任意一條邊都有f(edge)<=c(edge)。

二、最大流的定義:在不違背網路流的定義下,s到t的最大流量。

三、増廣路的思想。

我們先考慮乙個網路流:紅色數字表示實際流量,藍色表示邊的容量,黃色表示更優的流量。

這個流從s到t的流量是5,但其顯然不是最優的。

這個流比上面那個優,而且事實上,這個流就是當前網路的最大流。

我們將兩個圖比較,得出下圖

我們發現因為這條路徑上的每條邊流量都加了一。注意到其中有一條a到b的反向邊,所以我們尋找這種路徑時,應把原圖中所有邊的剩餘流量和已經流量的反向邊加進去(退流),當圖中不存在這種路徑時,此圖已成最大流。(順便提一下,這種路徑叫増廣路徑)。

四、求最大流的演算法:

ff:xyf大神說ff就是每次將源點的壓力增加1,找一下増廣路,慢點要死。於是直接上ek。

ek:每次找一條増廣路,將這條路徑上所有的流量增加(不管正向反向,其實這裡已經沒有流量這個概念了)找到增廣路徑中最小的△。

上**:

#include#include

#include

#include

#include

using

namespace

std;

#define n 1100

#define inf 0x3f3f3f3f

struct

note

;vector

path[n];

bool

used[n];

intn,m;

void make_way(int u,int v,int

c));

path[v].push_back((note));

}int dfs(int s,int t,int

f) }

}return0;

}int max_flow(int s,intt)}

intmain()

printf(

"%d\n

",max_flow(1

,n));

}

dinic:就是先對圖進行分層遍歷,然後在分層圖中進行dfs搜尋,比ek快,10000的隨即資料隨便過。

網路流 最大流 Edmonds Karp演算法

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

網路流最大流 Dinic演算法

o n 2 m 的演算法 比ek的o n m 2 優很多 ek通常解決10 3 10 4規模的網路 而dinic能解決10 4 10 5的網路 dinic演算法的思想也是分階段地在層次網路中增廣。它與最短增廣路演算法不同之處是 最短增廣路每個階段執行完一次bfs增廣後,要重新啟動bfs從源點vs開始...

網路流 最大流Dinic演算法

突然發現到了新的一年什麼東西好像就都不會了涼涼 建殘量網路圖 在殘量網路圖上跑增廣路 重複1直到沒有增廣路 注意乙個殘量網路圖要盡量把價值都用完,不然會浪費建圖的時間 include include include include include include include include in...