P3381 模板 最小費用最大流

2022-05-08 02:27:06 字數 1587 閱讀 2975

如題,給出乙個網路圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網路最大流和在最大流情況下的最小費用。

第一行包含四個正整數n、m、s、t,分別表示點的個數、有向邊的個數、源點序號、匯點序號。

接下來m行每行包含四個正整數ui、vi、wi、fi,表示第i條有向邊從ui出發,到達vi,邊權為wi(即該邊最大流量為wi),單位流量的費用為fi。

一行,包含兩個整數,依次為最大流量和在最大流量情況下的最小費用。

輸入 #1複製

4 5 4 3

4 2 30 2

4 3 20 3

2 3 20 1

2 1 30 9

1 3 40 5

輸出 #1複製

50 280
時空限制:1000ms,128m

(byx:最後兩個點改成了1200ms)

資料規模:

對於30%的資料:n<=10,m<=10

對於70%的資料:n<=1000,m<=1000

對於100%的資料:n<=5000,m<=50000

樣例說明:

如圖,最優方案如下:

第一條流為4-->3,流量為20,費用為3*20=60。

第二條流為4-->2-->3,流量為20,費用為(2+1)*20=60。

第三條流為4-->2-->1-->3,流量為10,費用為(2+9+5)*10=160。

故最大流量為50,在此狀況下最小費用為60+60+160=280。

故輸出50 280。

在最大流的e-k求法中,我們遍歷全圖,找到一條可增廣的路徑。那麼在最大流不變時,每段費用越少越優,所以我們可以使用spfa來代替dfs,此外因為有負值的存在,使用dij會比較麻煩,因而選擇spfa。時間複雜度上線為o(nm^2)。

#include#define n 10700

#define m 107000

#define inf 1<<29

using

namespace

std;

struct

nodee[m*2

];int tot=1,head[n],maxflow=0,ans=0

;int

n,m,s,t;

void add(int x,int y,int z,int

p)int

incf[n],v[n],pre[n],d[n];

bool

spfa()}}

if(d[t]==0x3f3f3f3f) return

false

;

return

true;}

void

update()

maxflow+=incf[t];

ans+=d[t]*incf[t];

}int

main()

while

(spfa()) update();

cout

"return0;

}

P3381 模板 最小費用最大流

如題,給出乙個網路圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網路最大流和在最大流情況下的最小費用。include define ll long long define inf 0x3f3f3f3f using namespace std const int n 1e5 10 i...

P3381 模板 最小費用最大流

我其實不會ek,只會死記dinic,事實證明ek演算法非常的淺顯易懂。ek演算法是怎麼弄的?說白了就是乙個bfs找增廣路徑,只要有流量可以流,就去增廣一波。如果探到了t點的話,就可以進行一次成功的增廣了。如何實現?我們需要兩個輔助陣列,比dinic多。flow陣列,表示乙個點目前可以流的流量。las...

洛谷 P3381 模板 最小費用最大流

乙個網路圖雖然最大流確定,但達到最大流的方案並不唯一。如果對於每條邊,都加乙個費用f,表示這條邊流過單位流量的代價,求達到最大流時的最小費用,這就是最小費用最大流問題。解決方法 ek費用流或zwk費用流。這裡只講ek費用流。採用貪心的思想。我們每次增廣時都選擇費用最小的一條。這樣,因為最大流是確定的...