ZJOI2010 網路擴容 費用流

2022-03-29 04:01:48 字數 1442 閱讀 7983

給定一張有向圖,每條邊都有乙個容量\(c\)和乙個擴容費用\(w\)。這裡擴容費用是指將容量擴大\(1\)所需的費用。求:

在不擴容的情況下,\(1\)到\(n\)的最大流;

將\(1\)到\(n\)的最大流增加\(k\)所需的最小擴容費用。

先求出原圖的最大流,大小設為\(f\)。對於原圖中的每條邊\((u,v,w)\),我們連邊\((u,v,w,0)\)和\((u,v,+\infin,c)\),後面的那條邊表示增加的流量。我們再連一條邊\((n,n+1,f+k,0)\),表示流量增加\(k\)的限制。最後求\(1\)到\(n+1\)的最小費用最大流即可。

#include#include#include#include#define maxn 10000 

#define maxm 100000

#define inf 0x3f3f3f3f3f3f3f3f

using namespace std;

typedef long long ll;

namespace maxfe[maxm*2+5];

int head[maxn+5];

int cur[maxn+5];

int esz=1;

void add_edge(int u,int v,int w)

int deep[maxn+5];

bool bfs(int s,int t)}}

return deep[t]>0;

}ll dfs(int x,int t,ll minf)

}return minf-rest;

}ll dinic(int s,int t)

return ans;

}} namespace mcmfe[maxm*2+5];

int head[maxn+5];

int esz=1;

void add_edge(int u,int v,ll w,ll c)

ll dist[maxn+5],minf[maxn+5],last[maxn+5];

bool inq[maxn+5];

bool spfa(int s,int t)}}

}}

if(dist[t]==inf) return 0;

else return 1;

}void update(int s,int t)

}ll mcmf(int s,int t)

return ct;

}} int n,m,k,s,t;

int main()

ll maxflow=maxf::dinic(s,t);

printf("%lld ",maxflow);

mcmf::add_edge(t,t+1,k+maxflow,0);//確保最大流增加了k

printf("%lld",mcmf::mcmf(s,t+1));

}

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,表示有向圖的...