一、網路流的定義:有向圖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#includedinic:就是先對圖進行分層遍歷,然後在分層圖中進行dfs搜尋,比ek快,10000的隨即資料隨便過。#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));
}
網路流 最大流 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...