請想象一組相互連線大小不一的輸油管道,每根管道有它自己的流量和容量,問從起點到終點的最大流量是多少?如下流量圖中,深色路徑流量之和為最大路徑。如何求得,下面內容將詳細介紹。
乙個流量網路,是一張邊的權重(這裡稱為容量)為正的加權有向圖。乙個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...