這一眼就是網路流題目
第一問十分簡單,直接最大流即可
那麼怎麼做第二問呢?
我們觀察到,先算出了第一問的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,表示有向圖的...