網路流的最大流入門(從普通演算法到dinic優化)

2021-08-15 02:29:22 字數 3455 閱讀 9691

網路流(network-flows)是一種模擬水流的解決問題方法,與線性規劃密切相關。網路流的理論和應用在不斷發展。而我們今天要講的就是網路流裡的一種常見問題——最大流問題。

最大流問題(maximum flow problem),一種組合最優化問題,就是要討論如何充分利用裝置的能力,使得運輸的流量最大,以取得最好的效果。求最大流的標號演算法最早由福特和福克遜與與2023年提出,20世紀50年代福特(ford)、(fulkerson)建立的「網路流理論」,是網路應用的重要組成成分。

網路流圖是一張只有乙個源點和匯點的有向圖,而最大流就是求源點到匯點間的最大水流量,下圖的問題就是乙個最基本,經典的最大流問題

如圖所示,如果我們每次都找出一條增廣路,只要這條增廣路經過匯點,那說明此時水流還可以增加,增加的量為d(d=min(d,c(u,v)-f(u,v))或d=min(d,f(u,v)))。

我們可以這樣理解:對於每一條正向邊,他能新增的最大水流為c(u,v)-f(u,v)。而對於反向邊來說,當正向邊上的水流增多時,反向邊自身的反向水流會減少,而其能減少的最多水量為f(u,v)。由於要保證新增水流之後,所有的f(u,v)都是可行流,所以我們取最小值。

增加之後,我們要更新流量,每條正向邊+d,每條反向邊-d即可。

0;}dinic演算法是網路流最大流的優化演算法之一,每一步對原圖進行分層,然後用dfs求增廣路。時間複雜度是o(n^2*m),dinic演算法最多被分為n個階段,每個階段包括建層次網路和尋找增廣路兩部分。

dinic演算法的思想是分階段地在層次網路中增廣。它與最短增廣路演算法不同之處是:最短增廣路每個階段執行完一次bfs增廣後,要重新啟動bfs從源點st開始尋找另一條增廣路;而在dinic演算法中,只需一次bfs過程就可以實現多次增廣。

簡單來說,分為下面幾步:

1.在剩餘網路中查詢是否存在從s到t的路徑,同時建分層圖。

分層圖的層數其實就是s到i這個點需要幾步。

2.沿著分層圖多路增廣。

增廣時一定要滿足dis[j]=dis[i]+1。

3.直到沒有s到t的路徑是結束演算法。

鍊錶版

#include

using namespace std;

intread()

const int maxn=10005,maxm=100005;

int n,m,st,en,x,y,c,h,t,ans,use,cnt=0;

int nxt[maxm*2],head[maxn],dis[maxn],q[maxm*6];

struct nodel[maxm*2];

void add(int

x,int

y,int c);

nxt[cnt]=head[x];

head[x]=cnt;

cnt++;

l[cnt]=(node);

nxt[cnt]=head[y];

head[y]=cnt;

cnt++;

}int bfs()

use=nxt[use];}}

return dis[en];

}int dinic(int now,int

x) }

use=nxt[rec];

}return0;}

int main()

while(bfs())

printf("%d",ans);

return

0;}

vector版
#include 

#include

#include

#include

using

namespace

std;

int read()

const

int maxn=10005,maxm=100005;

int n,m,s,t,x,y,c,ans;

int w[maxm*2],to[maxm*2],cnt;

int l[maxm*5],h,t,dist[maxn];

vector

a[maxn];

bool bfs()}}

return dist[t];

}int find(int now,int x)}}

return0;}

int main()

while(bfs())

printf("%d",ans);

return

0;}

網路最大流入門

網路最大流是網路流中最基礎也是最重要的部分,後邊的許多模型也都是由最大流問題引申而來的 在研究這個問題之前,讓我們先來學習一下前置知識 設 f u,v 表示邊 u,v 的當前容量上限 設 c u,v 表示邊 u,v 的最大容量上限 如果網路流圖中的流量滿足 則稱該流為乙個可行流 增廣 即增加一條路徑...

網路流入門 用於最大流的Dinic演算法

posted 2011年05月2日 by comzyh 網路流博大精深 sideman語 感謝whd的大力支援 最早知道網路流的內容便是最大流問題,最大流問題很好理解 解釋一定要通俗 如右圖所示,有乙個管道系統,節點,有向管道,即有向圖一張.1 是源點,有無限的水量,4 是匯點,管道容量如圖所示.試...

網路流 最大流 Edmonds Karp演算法

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