ZJOI2010 網路容量

2021-10-24 13:42:19 字數 1784 閱讀 4270

這一眼就是網路流題目

第一問十分簡單,直接最大流即可

那麼怎麼做第二問呢?

我們觀察到,先算出了第一問的max

flow

maxflow

maxflo

w,然後第二問等價於在原圖中(原圖中每條邊費用為0),每條邊加上一條流量為∞

\infty

∞,費用為原邊的費用的圖

然後根據最大流最小費用演算法,我們可以知道其實是不用重新建整個圖,只需要在當前殘量網路中加上原圖沒有的邊即可

這是因為最大流最小費用演算法每次會找出費用最小的一條增廣路,我們求最大流時每條增廣路費用均為0,一定符合條件

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

1000

, maxm =

1e4, inf =

1<<30;

struct whead[maxm + maxm +10]

;struct edgee[maxm +10]

;int a[maxn +10]

, vis[maxn +10]

, dis[maxn +10]

, minf[maxn +10]

, lx[maxn +10]

, tot =1;

inline

intread()

;inline

void

add(

int x,

int y,

int i,

int f,

int c)

inline

void

add_edge

(int x,

int y,

int f,

int c)

bool

spfa

(int s,

int t,

int n)}}

}return dis[t]

< inf;

}int

mcmf

(int s,

int t,

int n,

int op)}if

(op)

return maxflow;

else

return mincost;

}int

main()

int maxflow =

mcmf(1

, n, n,1)

;printf

("%d "

, maxflow)

;add_edge

(n +1,

1, k,0)

;for

(register

int i =

1; i <= m;

++i)

add_edge

(e[i]

.x, e[i]

.y, inf, e[i]

.c);

int mincost =

mcmf

(n +

1, n, n +1,

0);printf

("%d\n"

, mincost)

;return0;

}inline

intread()

ZJOI2010 網路擴容

題目描述 給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1 在不擴容的情況下,1到n的最大流 2 將1到n的最大流增加k所需的最小擴容費用。輸入格式 輸入檔案的第一行包含三個整數n,m,k,表示有向圖的點數 邊數以及所需要增加的流量。接下來的m行每...

ZJOI2010 網路擴容

最大流 費用流 洛谷位址 第一問就直接跑最大流。第二問目前有兩種方法 include include include include using namespace std define inf 0x7fffffff int n,m,k,s,t struct edgee 100005 int fir...

zjoi2010 網路擴容

描述 description 給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1 在不擴容的情況下,1到n的最大流 2 將1到n的最大流增加k所需的最小擴容費用。輸入格式 input format 輸入檔案的第一行包含三個整數n,m,k,表示有向圖的...