【bzoj1834】[ZJOI2010]network 网络扩容
1834: [ZJOI2010]network 网络扩容
Time Limit: 3 Sec Memory Limit: 64 MB
Submit: 2701 Solved: 1368
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 5 8
2 5 9 9
5 1 6 2
5 1 1 8
1 2 8 7
2 5 4 9
1 2 1 1
1 4 2 1
Sample Output
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<queue>
using namespace std;
#define INF 1000000000
#define MAXN 5010
struct node{int x,y,next,v,c,rel;}e[MAXN*],edge[MAXN*];
int n,m,k,len,ans,Link[MAXN],level[MAXN],vis[MAXN],dis[MAXN],lastnode[MAXN],lastedge[MAXN],q[MAXN*];
inline int read()
{
int x=,f=; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-; ch=getchar();}
while(isdigit(ch)) {x=x*+ch-''; ch=getchar();}
return x*f;
}
void insert(int x,int y,int v,int c)
{
e[++len].next=Link[x];Link[x]=len;e[len].x=x;e[len].y=y;e[len].v=v;e[len].c=c;e[len].rel=len+;
e[++len].next=Link[y];Link[y]=len;e[len].x=y;e[len].y=x;e[len].v=;e[len].c=-c;e[len].rel=len-;
}
bool bfs()
{
memset(level,-,sizeof(level));
int head=,tail=; q[]=; level[]=;
while(++head<=tail)
for(int i=Link[q[head]];i;i=e[i].next)
if(level[e[i].y]<&&e[i].v)
{
q[++tail]=e[i].y;
level[q[tail]]=level[q[head]]+;
}
return level[n]>=;
}
int dinic(int x,int flow)
{
if(x==n) return flow;
int maxflow=,d=;
for(int i=Link[x];i&&maxflow<flow;i=e[i].next)
if(level[e[i].y]==level[x]+&&e[i].v)
if(d=dinic(e[i].y,min(e[i].v,flow-maxflow)))
{
maxflow+=d;
e[i].v-=d;
e[e[i].rel].v+=d;
}
if(!maxflow) level[x]=-;
return maxflow;
}
void solve1()
{
int d=;
ans=;
while(bfs())
while(d=dinic(,INF))
ans+=d;
printf("%d ",ans);
}
bool spfa()
{
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
int head=,tail=,oo=dis[];
q[]=; vis[]=; dis[]=;
while(++head<=tail)
{
int x=q[head];
for(int i=Link[x];i;i=e[i].next)
if(dis[x]+e[i].c<dis[e[i].y]&&e[i].v)
{
dis[e[i].y]=dis[x]+e[i].c;
if(!vis[e[i].y])
{
q[++tail]=e[i].y;
vis[e[i].y]=;
}
lastnode[e[i].y]=x; lastedge[e[i].y]=i;
}
vis[x]=;
}
return dis[n]<oo;
}
void cost()
{
int d=k;
for(int i=n;i!=;i=lastnode[i])
if(e[lastedge[i]].v<d)
d=e[lastedge[i]].v;
for(int i=n;i!=;i=lastnode[i])
{
int j=lastedge[i];
e[j].v-=d;
e[e[j].rel].v+=d;
ans+=d*e[j].c;
}
k-=d;
}
void solve2()
{
ans=;
while(k)//控制1点的流量,相当于一个超级源的作用
{
spfa();
cost();
}
printf("%d\n",ans);
}
int main()
{
freopen("cin.in","r",stdin);
freopen("cout.out","w",stdout);
n=read(); m=read(); k=read();
for(int i=;i<=m;i++)
{
int x=read(),y=read(),v=read(),c=read();
insert(x,y,v,);
edge[i].x=x; edge[i].y=y; edge[i].c=c;
}
solve1();
for(int i=;i<=m;i++) insert(edge[i].x,edge[i].y,k,edge[i].c);
solve2();
return ;
}
【bzoj1834】[ZJOI2010]network 网络扩容的更多相关文章
- BZOJ1834 [ZJOI2010]network 网络扩容 【最大流,费用流】
1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 3394 Solved: 1774 [Subm ...
- [BZOJ1834][ZJOI2010]network 网络扩容 最大流+费用流
1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 3330 Solved: 1739 [Subm ...
- bzoj1834: [ZJOI2010]network 网络扩容 费用流
bzoj1834 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小扩容 ...
- 【费用流】bzoj1834: [ZJOI2010]network 网络扩容
还是稍微记一下这个拆点模型吧 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: ...
- 2018.10.13 bzoj1834: [ZJOI2010]network 网络扩容(最大流+费用流)
传送门 网络流水题啊. 第一问直接放心跑最大流(本来还以为有什么tricktricktrick). 第二问就直接把原来的边(u,v,c,w)(u,v,c,w)(u,v,c,w)变成(u,v,c,0)( ...
- 【最大流】【费用流】bzoj1834 [ZJOI2010]network 网络扩容
引用题解: 最大流+费用流. 第一问最大流即可. 第二问为“最小费用最大流”. 由题意,这一问的可转化为在上一问的“残量网络”上,扩大一些边的容量,使能从新的图中的最大流为k. 那么易得:对于还有剩余 ...
- BZOJ1834 [ZJOI2010]network 网络扩容(最小费用最大流)
挺直白的构图..最小费用最大流的定义. #include<cstdio> #include<cstring> #include<queue> #include< ...
- bzoj1834 [ZJOI2010]network 网络扩容
第一问跑最大流,第二问新建一条边连接0和1,流量为上第一问的答案+k,费用为0,接下来图中每条边拆成两条边,第一条容量为C费用为0,第二条容量无穷费用为W,再跑一遍费用流即可. 代码 #include ...
- 【BZOJ1834】[ZJOI2010]network 网络扩容 最大流+最小费用流
[BZOJ1834][ZJOI2010]network 网络扩容 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不 ...
- bzoj1834: [ZJOI2010]network 网络扩容
努力看了很久样例一直过不了...然后各种输出中间过程啊巴拉巴拉弄了1h,没办法了...然后突然想到啊原来的边可以用啊为什么不用...于是A了...感人肺腑 #include<cstdio> ...
随机推荐
- ng $interval(周期性定时器) $timeout(延迟定时器)
<!DOCTYPE html> <html ng-app="myApp"> <head lang="en"> <met ...
- Logical standby database 搭建(配置)
说明 Logical standby 数据库是通过Physical standby数据库转换的.本Logical standby是通过之前创建的Physical standby转换的. Physica ...
- 核PCA投影平面公式推导
样本方差推导 样本方差公式\[S = \frac{1}{n-1}\sum_{i=1}^n(x_i-\mu_i)^2\] 扩展开来得到\[S = \frac{1}{n-1}[(X-\frac{1}{n} ...
- HDFS的工作原理扫扫盲
问题导读: 1.什么是分布式文件系统? 2.怎样分离元数据和数据? 3.HDFS的原理是什么? Hadoop分布式文件系统(HDFS)是一种被设计成适合运行在通用硬件上的分布式文件系统.HDFS是一个 ...
- 洛谷P2835 刻录光盘
传送门 题目大意:有光盘可以传着看,问最少从哪几个人分发,能全部传一遍. 题解:缩点后求入度为0的点的个数 代码: #include<iostream> #include<cstdi ...
- selenium - 控制浏览器窗口的大小和浏览器最大化
1.控制浏览器大小 有些前端的页面需要查看在不同像素下的兼容情况,比如把像素设置为 480*800,然后截图看看页面显示有没有问题 WebDriver 提供了 set_windows_size() 方 ...
- CAN总线优点
废除传统的站地址编码,代之以对通信数据块进行编码,可以多主方式工作: 采用非破坏性仲裁技术,当两个节点同时向网络上传送数据时,优先级低的节点主动停止数据发送,而优先级高的节点可不受影响继续传输数据,有 ...
- java多线程练习实例
总结: 循环的使用率蛮高,Thraed.sleep(),try-catch语句 package com.aa; public class West { public static void main( ...
- java中的getProperty()方法。获取系统中属性名为key的属性对应的值
总结:getProperty方法:获取系统中属性名为key的属性对应的值,系统中常见的属性名以及属性如下: 现在用getProperty()的方法,获取系统信息代码: package com.aaa; ...
- (转) 读懂IL
引言 转自园子里的一片关于IL的好文,分享的同时,方便自己今后查阅. 原文链接:http://www.cnblogs.com/brookshi/p/5225801.html ------ 略过作者调侃 ...