網路流演算法

2022-06-28 08:36:15 字數 2861 閱讀 7625

原文部落格:

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

二.流量,容量和可行流

對於弧(u,v)來說,流量就是其上流過的水量(我們通常用f(u,v)表示),而容量就是其上可流過的最大水量(我們通常用c(u,v)表示),只要滿足f(u,v)<=c(u,v),我們就稱流量f(u,v)是可行流(對於最大流問題而言,所有管道上的流量必須都是可行流)。

三.增廣路

如果一條路上的所有邊均滿足:

正向邊: f(u,v)< c(u,v) ——– 反向邊:f(u,v)> 0

則我們稱這條路徑為一條增廣路徑,簡稱增廣路。

好了,弄懂了一些定義,接下來就可以介紹著名的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即可。

既然這樣,我們的思路就是:

1.找出一條增廣路徑

——2.修改其上點的值——3.繼續重複1,直至找不出增廣路。則此時源點的匯出量即為所求的最大流。

我這裡就不貼這個演算法的**了,想看的可以去原文上面看。在這裡我貼一下dinic演算法**模板:

dinic演算法

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的路徑是結束演算法。

下面**的題目解析可以到這裡看

**:

1 #include2 #include

3 #include4 #include5 #include6

using

namespace

std;

7const

int maxn=10000;8

const

int inf=0x3f3f3f3f;9

inthead[maxn],cnt,st,en,dis[maxn],cur[maxn];

10struct

edge

11e[maxn];

14void add_edge(int x,int y,int

z)15

22bool

bfs()

2340}41

}42return

dis[en];43}

44int dinic(int s,int

limit)

4561}62

if(!ans) dis[s]=-1;63

return

ans;64}

65int

main()

6678

for(int i=1;i<=d;++i)

7983

for(int i=1;i<=n;++i)

8496

for(int j=0;jj)

97102

}103

//到這建圖結束

104105

int ans=0

;106

while

(bfs())

107112 printf("

%d\n

",ans);

113return0;

114 }

網路流演算法

問題描述 如圖4 1所示是聯結某產品地v1和銷售地v4的交通網,每一弧 vi,vj 代表從vi到vj的運輸線,產品經這條弧由vi輸送到vj,弧旁的數表示這條運輸線的最大通過能力。產品經過交通網從v1到v4。現在要求制定乙個運輸方案使從v1到v4的產品數量最多。圖 4 1 圖 4 2 一 基本概念及相...

網路流演算法

ek演算法模板 演算法複雜度 n m m n為點數,m為邊數 源點 1,匯點 n。const int maxn 310,inf 0x7fffffff int pre maxn mat maxn maxn bool vis maxn int n,m int augment else q.push ba...

網路流演算法

網路流演算法 網路流演算法用於解決從源點到匯點最大流的問題。edmonds karp演算法 演算法主要思想 每次bfs找到一條從源點到匯點的最少路徑數的可行路徑,同時把這條路徑塞滿,這條路上的最小容量即為這條路徑的流量。然後將這條路徑的正向邊刪除,增加一條容量相同的反向邊,當bfs無法進行下去的時候...