演算法 18 最大流量問題(網路流演算法)

2021-07-22 20:46:08 字數 2524 閱讀 2685

請想象一組相互連線大小不一的輸油管道,每根管道有它自己的流量和容量,問從起點到終點的最大流量是多少?如下流量圖中,深色路徑流量之和為最大路徑。如何求得,下面內容將詳細介紹。

乙個流量網路,是一張邊的權重(這裡稱為容量)為正的加權有向圖。乙個st-流量網路有兩個已知的頂點,即起點s和終點t。

也稱為增廣路徑演算法。它的定義是:網路中的初始流量為零,沿著任意從起點到終點(且不含有飽和的正向邊或是空逆向邊)的增廣路徑增大流量,直到網路中不存在這樣的路徑為止。

也即,假設x為該路徑上的所有邊中未使用容量的最小值,那麼只需將所有邊的流量增大x,即可將網路中的總流量至少增大x。反覆這個過程,直到所有起點到終點的路徑上至少有一條邊是飽和的。

這裡,與流量對應的邊的方向和流量本身相反。**如下flownetwork類。

對ford-fulkerson演算法最簡單的實現可能就是最短增廣路徑演算法了(最短指的是路徑長度最小,而非流量或是容量)。增廣路徑的查詢等價於剩餘網路中的廣度優先搜尋(bfs)。

public

class

fordfulkerson

//增大流量

for(int v = t; v != s; v = edgeto[v].other(v))

value += bottle;

}

}private

boolean

hasaugmentingpath(flownetwork g, int s, int t)}}

return marked[t];

}public

double

value()

public

boolean

incut(int v)

public

static

void

main(string args)

;int to = new

int;

double capacity = new

double;

for(int i = 0; i < from.length; i++)

int s = 0, t = g.v() - 1;

fordfulkerson maxflow = new fordfulkerson(g, s, t);

system.out.println("max flow from " + s + " to " + t);

for(int v = 0; v < g.v(); v++)}}

system.out.println("max flow value = " + maxflow.value());}}

輸出:

max flow from 0 to 5

0->2 3.00 2.00

0->1 2.00 2.00

1->4 1.00 1.00

1->3 3.00 1.00

2->4 1.00 1.00

2->3 1.00 1.00

3->5 2.00 2.00

4->5 3.00 2.00

max flow value = 4.0

剩餘網路類,其中的flowedge類的基礎是加權邊有向邊。

public

class

flownetwork

}public

intv()

public

inte()

public

void

addedge(flowedge e)

public iterableadj(int v)

public iterableedges()}}

return b;}}

public

class

flowedge

public

intfrom()

public

intto()

public

double

capacity()

public

double

flow()

public

inteither()

public

intother(int vertex)

else

if(vertex == w)

else

}public

double

residualcapacityto(int vertex)

else

if(vertex == w)

else

}public

void

addresidualflowto(int vertex, double delta)

else

if(vertex == w)

else

}public string tostring()

}

網路流 最大流 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...