1834: [ZJOI2010]network 网络扩容

Time Limit: 3 Sec  Memory Limit: 64 MB
Submit: 3351  Solved: 1750
[Submit][Status][Discuss]

Description

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

Input

输入文件的第一行包含三个整数N,M,K,表示有向图的点数、边数以及所需要增加的流量。 接下来的M行每行包含四个整数u,v,C,W,表示一条从u到v,容量为C,扩容费用为W的边。

Output

输出文件一行包含两个整数,分别表示问题1和问题2的答案。

Sample Input

5 8 2
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

13 19
30%的数据中,N<=100
100%的数据中,N<=1000,M<=5000,K<=10
 

题目链接:

    http://www.lydsy.com/JudgeOnline/problem.php?id=1834

Solution

    值得一做的好题。。。

    第一问是赤果果的最大流。。。上模板就好。。。

    然后问扩流的最小费用。。。发现可以直接利用之前跑完最大流剩下的残余网络。

    在每一条边上额外加一条容量无限大的边,但是这样不能控制流的大小,所以要额外添加一个汇点S。

    从S向原起点连一条容量为k的边,再跑一遍费用流,就是第二问的答案。。。

代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define N 1010
#define inf 2000000000
using namespace std;
inline int Read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m,k,ans=0,cnt=1,S,T;
int hed[N],dis[N],l[N],q[200000];
bool vis[N];
struct edge{
int l,r,nxt,v,c,t;
}e[50000];
void insert(int u,int v,int w,int c){
cnt++;e[cnt].l=u;e[cnt].r=v;e[cnt].nxt=hed[u];hed[u]=cnt;e[cnt].v=w;e[cnt].c=0;e[cnt].t=c;
cnt++;e[cnt].l=v;e[cnt].r=u;e[cnt].nxt=hed[v];hed[v]=cnt;e[cnt].v=0;e[cnt].c=0;e[cnt].t=-c;
}
bool BFS(){
int head=0,tail=1,now;
memset(dis,-1,sizeof(dis));
dis[S]=1;q[1]=S;
while(head!=tail){
head++;
now=q[head];
for(int i=hed[now];i;i=e[i].nxt)
if(e[i].v && dis[e[i].r]==-1){
dis[e[i].r]=dis[now]+1;
q[++tail]=e[i].r;
}
}
return dis[T]!=-1;
}
int DFS(int x,int F){
if(x==T)return F;
int w,used=0;
for(int i=hed[x];i;i=e[i].nxt)
if(dis[e[i].r]==dis[x]+1){
w=F-used;
if(w>e[i].v)w=e[i].v;
w=DFS(e[i].r,w);
e[i].v-=w;
e[i^1].v+=w;
used+=w;
if(used==F)return F;
}
if(!used)dis[x]=-1;
return used;
}
void dinic(){
while( BFS() )
ans+=DFS(S,inf);
}
void ins(int u,int v,int w,int c){
cnt++;e[cnt].l=u;e[cnt].r=v;e[cnt].v=w;e[cnt].nxt=hed[u];hed[u]=cnt;e[cnt].c=c;
cnt++;e[cnt].l=v;e[cnt].r=u;e[cnt].v=0;e[cnt].nxt=hed[v];hed[v]=cnt;e[cnt].c=-c;
}
bool spfa(){
int head=0,tail=1,now;
for(int i=0;i<=n;i++)dis[i]=inf;
q[1]=S;dis[S]=0;vis[S]=1;
while(head!=tail){
head++;
now=q[head];
for(int i=hed[now];i;i=e[i].nxt)
if(e[i].v>0 && dis[now]+e[i].c<dis[e[i].r]){
dis[e[i].r]=dis[now]+e[i].c;
l[e[i].r]=i;
if(!vis[e[i].r]){
tail++;
q[tail]=e[i].r;
vis[e[i].r]=1;
}
}
vis[now]=0;
}
return dis[T]!=inf;
}
int mincf(){
int now,used=inf;
now=l[T];
while(now){
if(used>e[now].v)used=e[now].v;
now=l[e[now].l];
}
now=l[T];
while(now){
e[now].v-=used;
e[now^1].v+=used;
ans+=used*e[now].c;
now=l[e[now].l];
}
}
void Cost_Flow(){
while( spfa() )
ans+=mincf();
}
int main(){
int u,v,w,c;
n=Read();m=Read();k=Read();
S=1;T=n;
for(int i=1;i<=m;i++){
u=Read();v=Read();w=Read();c=Read();
insert(u,v,w,c);
}
dinic();
printf("%d ",ans);
ans=0;
int tot=cnt;
for(int i=2;i<=tot;i+=2)
ins(e[i].l,e[i].r,inf,e[i].t);
S=0;
ins(0,1,k,0);
Cost_Flow();
printf("%d\n",ans);
return 0;
}

  

  

This passage is made by Iscream-2001.

BZOJ 1834--网络扩容(最大流&费用流)的更多相关文章

  1. BZOJ 1834 网络扩容(最大流+费用流)

    对于第一问,直接求最大流. 对于第二问,建源点s和汇点t,s连1容量为INF,费用为0的边,n连t容量为最大流+k,费用为0的边.这样就把最大流限制为最多增加k了. 限制需要求扩充的最小费用,原图的边 ...

  2. BZOJ 1834 网络扩容 最大流+最小费用流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1834 题目大意: 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是 ...

  3. BZOJ 1834网络扩容题解

    一道不算太难的题目 但是真的很恶心 显然,对于第一问,我们直接无脑打模板就好了 第二问也不是很难,我们将每条边再连一条容量为inf,费用为w的边 但是流量只要小于第一问的答案加k就行了 所以我们增加一 ...

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

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

  5. 洛谷P2604 网络扩容 拆点+费用流

    原题链接 这题貌似比较水吧,最简单的拆点,直接上代码了. #include <bits/stdc++.h> using namespace std; #define N 1000 #def ...

  6. BZOJ 3876 支线剧情 | 有下界费用流

    BZOJ 3876 支线剧情 | 有下界费用流 题意 这题题面搞得我看了半天没看懂--是这样的,原题中的"剧情"指的是边,"剧情点"指的才是点. 题面翻译过来大 ...

  7. 从多种角度看[BZOJ 1061] [NOI 2008]志愿者招募(费用流)

    从多种角度看[BZOJ 1061] [NOI 2008]志愿者招募(费用流) 题面 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运 ...

  8. 【BZOJ】1834: [ZJOI2010]network 网络扩容(最大流+费用流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1834 我又思考人生了T_T,nd的数组开小了,一直wa,调了一个小时才发现啊!!!!!我一直以为我的 ...

  9. bzoj 1834: [ZJOI2010]network 网络扩容 -- 最大流+费用流

    1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec  Memory Limit: 64 MB Description 给定一张有向图,每条边都有一个容量C和一 ...

随机推荐

  1. web api的新玩法

    前言: 目前大多数的.net core 项目的web api 都是用的json作为数据传输格式,或者说几乎是所有的都是,可是有没有想过换一种数据传输格式怎么处理,比如XML,或者谷歌首推的Protob ...

  2. java日期公共类

    package com.mall.common; import java.text.ParseException; import java.text.SimpleDateFormat; import ...

  3. HDFS设计理念

    [HDFS设计理念] 1. 读取整个数据集的时间延迟比读取第一条记录的延迟更重要. 2. HDFS以高延迟为代价,要求低时间延迟数据访问的应用,不适合在HDFS上运行. 3. namenode决定了集 ...

  4. pymysql.err.IntegrityError: (1062, "Duplicate entry 'roxml-ROXML' for key 'PRIMARY'")

    在<Python数据挖掘-概念.方法与实践>一书的第3章实体匹配中,如果一路按照作者的代码及SQL语句进行配置运行的话,会出现如题目所示的错误.根据python脚本的执行错误提示显示,错误 ...

  5. 通过@Configuratin配置Bean

    Spring的依赖注入可以基于xml配置,也可以基于注解配置,还可以基于java类配置. 普通的bean类,只要标注了@Configuration注解,就可以为Spring容器提供Bean定义的信息. ...

  6. Cocoa Touch(三):图形界面UIKit、Core Animation、Core Graphics

    UIKit 视图树模型 1.视图树模型 计算机图形实际上是一个视图树模型,每个视图都有一个本地坐标系.每个本地坐标系的组成部分是:原点在父坐标系中的位置,每个基在父坐标系中的位置,由此就可以根据向量的 ...

  7. LUA Metatables

    __index:当我们访问一个表中的元素不存在时,则会触发去寻找__index元方法,如果不存在,则返回nil,如果存在,则返回结果. 博主注:__index有点像异常处理的意思 __newindex ...

  8. OLI 课程 & Java入学考试的五道题

    Unit  1:: Programming with Java ✔️ 机械.自动.不需要智慧地执行原始的内置指令. 字节码相同,JVM不同(体现平台) ✖️ In modern computers i ...

  9. 使用mybatis提供的各种标签方法实现动态拼接Sql。这里演示where标签和if标签实现使用姓名的模糊查询和性别查询用户列表,当用户没有选择姓名以及性别时查询出所有的记录。

    1.需求: 使用姓名的模糊查询和性别查询用户列表,当用户没有选择姓名以及性别时查询出所有的记录. 2.在UserMapper接口中定义方法: public List<User> findU ...

  10. python之selenium调用js(execute_script)

    转载: http://www.cnblogs.com/fnng/p/3230768.html 本节重点: 调用js方法 execute_script(script, *args) 在当前窗口/框架 同 ...