1362 网络扩容

省队选拔赛

 时间限制: 2 s
 空间限制: 128000 KB
 题目等级 : 大师 Master
 
 
题目描述 Description

给定一张有向图,每条边都有一个容量C和一个扩容费用W。这里扩容费用是指将容量扩大1所需的费用。求:

1、  在不扩容的情况下,1到N的最大流;

2、  将1到N的最大流增加K所需的最小扩容费用。

输入描述 Input Description

输入文件的第一行包含三个整数N,M,K,表示有向图的点数、边数以及所需要增加的流量。

接下来的M行每行包含四个整数u,v,C,W,表示一条从u到v,容量为C,扩容费用为W的边。

输出描述 Output Description

输出文件一行包含两个整数,分别表示问题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

数据范围及提示 Data Size & Hint

30%的数据中,N<=100

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

题解:

在最大流的参与网络上加新边跑最小费用最大流!

代码:

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#define maxn 10010
#define inf 0x7fffffff
#define S 1
#define T n using namespace std; int n,m,K,cnt=,vw[maxn],ans1,ans2,U[maxn],V[maxn],head[maxn],x,dis[maxn],inq[maxn],from[maxn]; struct ss
{
int to;
int next;
int c;
int w;
int from;
}e[]; void add(int u,int v,int c,int w)
{
e[++cnt].to=v;
e[cnt].next=head[u];
e[cnt].from=u;
e[cnt].c=c;
e[cnt].w=w;
head[u]=cnt;
} void insert(int u,int v,int c,int w)
{
add(u,v,c,w);
add(v,u,,-w);
} bool bfs()
{
for (int i=;i<=T;i++) dis[i]=inf;
queue<int> que;
que.push(S);
dis[S]=;
while (!que.empty())
{
int now=que.front();
que.pop();
for (int i=head[now];i;i=e[i].next)
if (e[i].c&&dis[e[i].to]>dis[now]+)
{
dis[e[i].to]=dis[now]+;
que.push(e[i].to);
if (e[i].to==T) return ;
}
}
return ;
} int dinic(int x,int INF)
{
if (x==T) return INF;
int rest=INF;
for (int i=head[x];i;i=e[i].next)
if (e[i].c&&dis[e[i].to]==dis[x]+)
{
int now=dinic(e[i].to,min(rest,e[i].c));
e[i].c-=now;
if (!now) dis[now]=;
e[i^].c+=now;
rest-=now;
}
return INF-rest;
} bool spfa()
{
for (int i=;i<=T;i++) dis[i]=inf;
queue<int> que;
que.push();
inq[]=;
dis[]=;
while (!que.empty())
{
int now=que.front();
que.pop();
inq[now]=;
for (int i=head[now];i;i=e[i].next)
if (e[i].c&&dis[e[i].to]>dis[now]+e[i].w)
{
dis[e[i].to]=dis[now]+e[i].w;
from[e[i].to]=i;
if (!inq[e[i].to])
{
inq[e[i].to]=;
que.push(e[i].to);
}
}
}
if (dis[T]==inf) return ;
else return ;
} int bcf()
{
int x=inf;
for (int i=from[T];i;i=from[e[i].from])
x=min(x,e[i].c);
for (int i=from[T];i;i=from[e[i].from])
{
ans2+=x*e[i].w;
e[i].c-=x;
e[i^].c+=x;
}
} int main()
{
scanf("%d%d%d",&n,&m,&K);
for (int i=;i<=m;i++)
{
int u,v,w,c;
scanf("%d%d%d%d",&U[i],&V[i],&c,&vw[i]);
insert(U[i],V[i],c,);
}
while (bfs())
while (x=dinic(S,inf)) ans1+=x;
insert(,,K,);
printf("%d ",ans1);
for (int i=;i<=m;i++)
insert(U[i],V[i],K,vw[i]);
while(spfa()) bcf();
printf("%d\n",ans2);
return ;
}

C++之路进阶——codevs1362(网络扩容)的更多相关文章

  1. BZOJ-1834 网络扩容 最小费用最大流+最大流+乱搞

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

  2. 【BZOJ】【1834】【ZJOI2010】Network 网络扩容

    网络流/费用流 这题……我一开始sb了. 第一问简单的最大流…… 第二问是要建费用流的图的……但是是在第一问的最大流跑完以后的残量网络上建,而不是重建…… 我们令残量网络上原有的弧的费用全部为0(因为 ...

  3. bzoj1834: [ZJOI2010]network 网络扩容

    努力看了很久样例一直过不了...然后各种输出中间过程啊巴拉巴拉弄了1h,没办法了...然后突然想到啊原来的边可以用啊为什么不用...于是A了...感人肺腑 #include<cstdio> ...

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

    第一问直接跑最大流.然后将所有边再加一次,费用为扩容费用,容量为k,再从一个超级源点连一条容量为k,费用为0的边到原源点,从原汇点连一条同样的边到超级汇点,然  后跑最小费用最大流就OK了. ---- ...

  5. App 组件化/模块化之路——如何封装网络请求框架

    App 组件化/模块化之路——如何封装网络请求框架 在 App 开发中网络请求是每个开发者必备的开发库,也出现了许多优秀开源的网络请求库.例如 okhttp retrofit android-asyn ...

  6. 【BZOJ1834】网络扩容(最大流,费用流)

    [BZOJ1834]网络扩容(最大流,费用流) 题面 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下 ...

  7. BZOJ_1834_[ZJOI2010]network 网络扩容_费用流

    BZOJ_1834_[ZJOI2010]network 网络扩容_费用流 题意: 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求:  1.在不扩容的 ...

  8. 【题解】Luogu P2604 [ZJOI2010]网络扩容

    原题传送门:P2604 [ZJOI2010]网络扩容 这题可以说是板题 给你一个图,先让你求最大流 再告诉你,每条边可以花费一些代价,使得流量加一 问至少花费多少代价才能使最大流达到k 解法十分简单 ...

  9. 【BZOJ1834】[ZJOI2010]network 网络扩容 最大流+最小费用流

    [BZOJ1834][ZJOI2010]network 网络扩容 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不 ...

随机推荐

  1. Linux文件锁flock

    Linux文件锁flock 在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock. flock,建议性锁 ...

  2. Windows环境下的NodeJS+NPM+Bower安装配置步骤

    Windows下的NodeJS安装是比较方便的(v0.6.0版本之后,支持windows native),只需要登陆官网(http://nodejs.org/),便可以看到首页的“INSTALL”按钮 ...

  3. c# winform 全角自动转化半角问题(C#中ImeMode的值):转载

    调用 this.ImeMode = ImeMode.OnHalf; ImeMode 枚举:指定一个值,该值是用来确定在选定了对象时该对象的输入法编辑器 (IME) 的状态. 以下是微软的解释: 成员名 ...

  4. 兼容所有浏览器的设为首页收藏本站js代码

    大家发现传统的收藏本站按钮在360浏览器下面没有效果了,但是360浏览器用户群却非常之大.所以我们在网上找到一个兼容所有浏览器的收藏本站解决方案,具体功能如下: 设为首页 和 收藏本站js代码 兼容I ...

  5. [LintCode] Longest Substring Without Repeating Characters

    Given a string, find the length of the longest substring without repeating characters. Have you met ...

  6. JAVA集合迭代遍历和特性介绍

    数组.集合:都是一种容器,用一个对象管理多个对象:数组不能自动增长:只能存放同类型的元素 集合能自动扩容:部分集合允许存放不同类型的元素: 1.List: 有顺序的,允许存放重复的元素: 遍历:for ...

  7. 常用JS表单验证方法

    /*输入:str返回:如果全是空返回true,否则返回false*/function isNull(str) {if (str == "") return true;var reg ...

  8. 状态压缩DP

    K - Necklace Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:327680KB     ...

  9. mysql syntax bypass some WAF

    select{x table_name}from{x information_schema.tables} mysql> select{x table_name}from{x informati ...

  10. Android studio快捷键总结

    功能 快捷键   功能 快捷键 格式化代码 command + alt + L   运行程序到设备 Ctrl + R 导包.修正 alt + enter   运行Debug到设备 Ctrl + D 复 ...