網路流 最小費用最大流 (理解)

2022-05-03 12:36:29 字數 1704 閱讀 9427

上篇文章我們講解了最大流問題,那什麼是最小費用最大流呢?聽名字就可以看出,我們要在滿足最大流的同時找到達成最大流的最小費用。

對於乙個網路流,最大流是一定的,但是組成最大流的費用是可以不同的,這裡就有了在最大流網路上產生的費用流網路,就有了最小花費問題。

簡單來說,就是滿足最大流的路徑可能有多條,我們要從這多條路徑中找到一條花費代價最小的路徑。所以最大流是解決這類問題的前提

我們用每條邊單位流量的花費作為邊權,假如一條合法路徑上每條邊的花費分別為 c1,c2,.......ck , 並且這條邊上的最小流量為flow,

那麼這條路徑上的花費為 : c1 * flow + c2*flow + ..... + ck*flow = (c1+ c2 + c3 + .... + ck)*flow =  dis [ci] * flow

這裡的 dis[ci] 就是我們要求的最短路!

採用貪心的思想,每次找到一條從源點到達匯點的路徑,增加流量,且該條路徑滿足使得增加的流量的花費最小,直到無法找到一條

從源點到達匯點的路徑,演算法結束。

由於最大流量有限,每執行一次迴圈流量都會增加,因此該演算法肯定會結束,且同時流量也必定會達到網路的最大流量;同時由於每次都是增加的最小的花 費,即當前的最小花費是所有到達當前流量flow時的花費最小值,因此最後的總花費最小。

1、找到一條從源點到達匯點的花費最小的路徑,該花費 =使用該路徑上的邊的單位費用之和

2、然後找出這條路徑上的邊的容量的最小值f,則當前最大流max_flow 擴充f(求最大流的過程,同時當前最小費用min_cost擴充f*min_dist(s,t)。

3、更新路徑流量 flow ,將這條路徑上的每條正向邊的容量都減少f,每條反向邊的容量都增加f。

4、重複(1~3)直到無法找到從源點到達匯點的路徑。

1、注意超級源點和超級終點的建立。這裡的超級源點/匯點的建立是把所有邊統一起來,構成一張網路圖,因為有些題目不會直接給你網路圖,

需要你自己去建立,例如 hdu 1533

2、初始化時,正向邊的單位流量費用為cost[u][v],那麼反向邊的單位流量費用就為 -cost[u][v]。正向邊和反向邊的費用互為相反數,因為回流費用減少。

3、費用cost陣列和容量cap陣列每次都要初始化為0。

4、求解從源點到匯點的「最短」路徑時,由於網路中存在負權邊,因此使用spfa來實現。

int cap[500][500],cost[500][500],flow[500][500];//

cap是容量,cost是花費,flow是流量

int pre[500],dis[500],vis[500],cnt[500];//

pre是記錄增廣路的前驅節點,dis[i]是記錄源點到節點i的最小距離

//vis[i]標記點是否在佇列中,cnt[i]記錄點i進入佇列的次數

intn,m;

intst,endd;

intmn_cost,mx_flow;

intspfa()}}

}if(dis[endd]>=mx)

return0;

return1;

}void bfs(int n)//

頂點數 mn_cost+=dis[endd]*f;

mx_flow+=f;

}}

模板題:

網路流 最小費用最大流

q 為什麼突然想搞網路流?a 迫於tham 蛤mu的淫威 用最短路演算法求出s t的路徑 把路徑要摳出來,而且每條邊要有容量 算一下路徑裡面的可以流過的最大的流量 發現此時的花費就是 dis t flow 累加即可.重複1 3直到不能夠到達t.include include include incl...

網路流 最大流 最小割 最小費用流

sap gap 鄰接表 sap gap 鄰接矩陣 dinic 鄰接矩陣 dinic 鄰接表 介個人寫的敲詳細 include include include include include using namespace std const int maxn 5010 const int maxn ...

網路最大流和最小費用流

from 網路最大流和最小費用流.html 網路流isap演算法的簡單介紹 from 這幾天由於種種原因經常接觸到網路流的題目,這一型別的題給人的感覺,就是要非常使勁的yy才能出來點比較正常的模型。尤其是看了amber最小割應用的文章,裡面的題目思路真是充滿了綿綿不絕的yd思想。然而比賽中,當你yd...