ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【ZJOI2010 Day1】网络扩容

2021-12-15 15:02:38  阅读:152  来源: 互联网

标签:扩容 pre int MAX tot Day1 ZJOI2010 len dis


Problem

给定一张有向图,每条边都有一个容量\(C\)和一个扩容费用\(W\)。这里扩容费用是指将容量扩大\(1\)所需的费用。求:
1.在不扩容的情况下,\(1\)到\(N\)的最大流;
2.将\(1\)到\(N\)的最大流增加\(K\)所需的最小扩容费用。

Solution

第一问显然很好求,但第二问怎么处理呢?

将最大流增加\(K\) \(=>\) 将最大流变成\(K\)

于是我们可以建立扩容重边,边(容量:\(\infty\),费用:\(W\)),再跑最小费用最大流,使得最大流变成\(K\),但是我们只要求的是最大流为\(K\),所以当最大流大于\(K\)时,要减去多算的费用。

\(code:\)

#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1000 + 5;
const int MAX_E = 60000 + 5;
const int MAX_M = 5000 + 5;
const int inf = 1e9;
int Flow,Cost,dis[MAX_N],inq[MAX_N],pre[MAX_N];
int n,m,k,S,T,a[MAX_N],b[MAX_N],c[MAX_N][MAX_N];
int Last[MAX_N],End[MAX_E],Next[MAX_E],len[MAX_E],cost[MAX_E],tot;
struct node{int x,y,z,w;}e[MAX_M];
inline void addedge(int x,int y,int z,int co){
	End[++tot]=y,Next[tot]=Last[x],Last[x]=tot,len[tot]=z,cost[tot]=co;
	End[++tot]=x,Next[tot]=Last[y],Last[y]=tot,len[tot]=0,cost[tot]=-co;
}
inline bool spfa(int W){
	for(int i=1;i<=T;i++) dis[i]=inf,pre[i]=0;
	dis[S]=0;
	queue<int> q;
	inq[S]=1;
	q.push(S);
	while(q.size()){
		int x=q.front();
		q.pop();
		inq[x]=0;
		for(int i=Last[x];i;i=Next[i]){
			int y=End[i];
			if(len[i] && dis[y]>dis[x]+cost[i]){
				dis[y]=dis[x]+cost[i];
				pre[y]=i;
				if(!inq[y]){
					q.push(y);
					inq[y]=1;
				}
			}
		}
	}
	int f=inf;
	if(dis[T]==inf) return false;
	for(int i=T;i!=S;i=End[pre[i]^1]) f=min(f,len[pre[i]]);
	if(W!=-1) f=min(f,k-Flow);
	for(int i=T;i!=S;i=End[pre[i]^1]) len[pre[i]]-=f,len[pre[i]^1]+=f;
	Flow+=f,Cost+=f*dis[T];
	if(W==-1) return true;
	return Flow<k;
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	S=1,T=n;
	tot=1;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d%d",&e[i].x,&e[i].y,&e[i].z,&e[i].w);
		addedge(e[i].x,e[i].y,e[i].z,0);
	}
	while(spfa(-1));
	printf("%d ",Flow);
	k+=Flow;
	Cost=0;
	for(int i=1;i<=m;i++){
		addedge(e[i].x,e[i].y,inf,e[i].w);
	}
	while(spfa(114514));
	printf("%d\n",Cost);
	return 0;
}

标签:扩容,pre,int,MAX,tot,Day1,ZJOI2010,len,dis
来源: https://www.cnblogs.com/TheAutumnGlory/p/15692770.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有