传送门

网络流水题啊。


第一问直接放心跑最大流(本来还以为有什么tricktricktrick)。

第二问就直接把原来的边(u,v,c,w)(u,v,c,w)(u,v,c,w)变成(u,v,c,0)(u,v,c,0)(u,v,c,0)和(u,v,inf,w)(u,v,inf,w)(u,v,inf,w),然后把ttt拆点限制流量跑费用流就行了。

代码:

#include<bits/stdc++.h>
#define N 1005
#define M 10005
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
int s,t,n,m,k,first[N],cur[N],d[N],flow[N],pos[N],pred[N],cnt;
bool in[N];
struct Edge{int u,v,w,c;}tt[M];
struct edge{int v,next,w,c;}e[M<<1];
inline void addedge(int u,int v,int c,int w){e[++cnt].v=v,e[cnt].next=first[u],e[cnt].c=c,e[cnt].w=w,e[cnt].v=v,first[u]=cnt;}
inline void add(int u,int v,int c,int w){addedge(u,v,c,w),addedge(v,u,0,-w);}
inline void init(){memset(first,-1,sizeof(first)),cnt=-1,s=1,t=n;}
inline bool bfs(){
	queue<int>q;
	memset(d,-1,sizeof(d)),d[s]=0,q.push(s);
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=first[x];~i;i=e[i].next){
			int v=e[i].v;
			if(!e[i].c||~d[v])continue;
			d[v]=d[x]+1,q.push(v);
		}
	}
	return ~d[t];
}
inline int dfs(int x,int f){
	if(!f||x==t)return f;
	int flow=f;
	for(int&i=cur[x];~i;i=e[i].next){
		int v=e[i].v;
		if(!flow)return f;
		if(e[i].c&&d[v]==d[x]+1){
			int tmp=dfs(v,min(flow,e[i].c));
			if(!tmp)d[v]=-1;
			e[i].c-=tmp,e[i^1].c+=tmp,flow-=tmp;
		}
	}
	return f-flow;
}
inline bool spfa(){
	queue<int>q;
	memset(d,0x3f3f3f3f,sizeof(d)),memset(in,false,sizeof(in)),q.push(s),d[s]=0,in[s]=true,pred[t]=-1,flow[s]=0x3f3f3f3f;
	while(!q.empty()){
		int x=q.front();
		q.pop(),in[x]=false;
		for(int i=first[x];~i;i=e[i].next){
			int v=e[i].v;
			if(e[i].c&&d[v]>d[x]+e[i].w){
				d[v]=d[x]+e[i].w,pred[v]=x,pos[v]=i,flow[v]=min(flow[x],e[i].c);
				if(!in[v])in[v]=true,q.push(v);
			}
		}
	}
	return d[t]!=0x3f3f3f3f;
}
inline int dinic(){
	int ret=0;
	while(bfs()){
		for(int i=1;i<=n;++i)cur[i]=first[i];
		ret+=dfs(s,0x3f3f3f3f);
	}
	return ret;
}
inline int mcmf(){
	int ret=0;
	for(int w=t;spfa();w=t){
		ret+=flow[t]*d[t];
		while(w!=s)e[pos[w]].c-=flow[t],e[pos[w]^1].c+=flow[t],w=pred[w];
	}
	return ret;
}
int main(){
	n=read(),m=read(),k=read(),init();
	for(int i=1;i<=m;++i){
		tt[i].u=read(),tt[i].v=read(),tt[i].c=read(),tt[i].w=read();
		add(tt[i].u,tt[i].v,tt[i].c,0);
	}
	int tmp=dinic();
	printf("%d ",tmp);
	memset(first,-1,sizeof(first)),cnt=-1;
	for(int i=1;i<=m;++i)add(tt[i].u,tt[i].v,tt[i].c,0),add(tt[i].u,tt[i].v,0x3f3f3f3f,tt[i].w);
	add(n,n+1,k+tmp,0),t=n+1,printf("%d",mcmf());
	return 0;
}

2018.10.13 bzoj1834: [ZJOI2010]network 网络扩容(最大流+费用流)的更多相关文章

  1. BZOJ1834 [ZJOI2010]network 网络扩容(最小费用最大流)

    挺直白的构图..最小费用最大流的定义. #include<cstdio> #include<cstring> #include<queue> #include< ...

  2. BZOJ 1834: [ZJOI2010]network 网络扩容(网络流+费用流)

    一看就知道是模板题= = ,不说什么了= = PS:回去搞期末了,暑假再来刷题了 CODE: #include<cstdio> #include<iostream> #incl ...

  3. BZOJ1834 [ZJOI2010]network 网络扩容 【最大流,费用流】

    1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 3394  Solved: 1774 [Subm ...

  4. [BZOJ1834][ZJOI2010]network 网络扩容 最大流+费用流

    1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 3330  Solved: 1739 [Subm ...

  5. 【最大流】【费用流】bzoj1834 [ZJOI2010]network 网络扩容

    引用题解: 最大流+费用流. 第一问最大流即可. 第二问为“最小费用最大流”. 由题意,这一问的可转化为在上一问的“残量网络”上,扩大一些边的容量,使能从新的图中的最大流为k. 那么易得:对于还有剩余 ...

  6. bzoj1834: [ZJOI2010]network 网络扩容 费用流

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

  7. 【费用流】bzoj1834: [ZJOI2010]network 网络扩容

    还是稍微记一下这个拆点模型吧 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求:  1.在不扩容的情况下,1到N的最大流:  ...

  8. bzoj1834 [ZJOI2010]network 网络扩容

    第一问跑最大流,第二问新建一条边连接0和1,流量为上第一问的答案+k,费用为0,接下来图中每条边拆成两条边,第一条容量为C费用为0,第二条容量无穷费用为W,再跑一遍费用流即可. 代码 #include ...

  9. BZOJ 1834: [ZJOI2010]network 网络扩容 最小费用流_最大流_残量网络

    对于第一问,跑一遍最大流即可. 对于第二问,在残量网络上的两点间建立边 <u,v>,容量为无限大,费用为扩充费用. 跑一遍最小费用流即可. Code: #include <vecto ...

随机推荐

  1. leetcode937

    public class Solution { public string[] ReorderLogFiles(string[] logs) { var list1 = new List<str ...

  2. maven项目中的报错问题——Dynamic Web Module 3.0 requires Java 1.6 or newer.

    转自:http://www.cnblogs.com/beppezhang/p/5919221.html maven项目中的报错问题——Dynamic Web Module 3.0 requires J ...

  3. Jenkins + testNg + maven 项目持续集成

    搞了一整天,梳理下关键点: 1.项目的pom.xml要配置插件,同时指定testng.xml文件的位置.就被这个卡了好久 <properties> <maven-surefire-p ...

  4. CategoryPanelGroup动态生成节点

    afw TCategoryPanel *cp; ; i < TreeView1->Items->Count; i++) { ) { cp = new TCategoryPanel(C ...

  5. 基于OpenGL编写一个简易的2D渲染框架-08 重构渲染器-整体架构

    事实上,前面编写的渲染器 Renderer 非常简陋,虽然能够进行一些简单的渲染,但是它并不能满足我们的要求. 当渲染粒子系统时,需要开启混合模式,但渲染其他顶点时却不需要开启混合模式.所以同时渲染粒 ...

  6. WDA-参考路径

    1. SAP Netweave安装 https://wenku.baidu.com/view/b3ac371a227916888486d77c.html?sxts=1545717961793   2. ...

  7. caffe openpose/Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields配置(转)

    Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields 是CVPR2017的一篇论文,作者称是世界上第一个基于深度学习的 ...

  8. python处理分隔大文件

    4个.sql格式的文件,2G大小,直接插入mysql数据中,文件太大了,导入不进去. 太大的文件用python处理也很麻烦,处理不了,只能先分隔成小文件处理. 文件中数据格式:其中values里面的数 ...

  9. java并发:CAS算法和ABA问题

    CAS算法是硬件对于并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令. CAS用于管理对共享数据的并发访问. java的并发包中,AQS.原子操作类等都是基于CAS实现的. CAS 是一种 ...

  10. ios web input 内边阴影

    ios网页中,默认input上部有阴影,去除方法: -webkit-appearance: none;