P2604 [ZJOI2010]网络扩容

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

说明

30%的数据中,N<=100

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


k这么小,开始以为是分层图搞事呢。

第一问裸的最大流。

第二问我们对初始的每条边新建一条费用边,容量为inf,表示随便用,单位费用就连初始费用,表示要花钱。

保证增加的流量为k,我们搞一个超级源点容量为k连原源点1。

在跑完最大流之后的残余网络上跑最小费用最大流。

之前对最大流求法中的反悔理解的不深刻,在写这个题的时候一直觉得直接跑残量网络失去了对原来最大流的反悔机会。但实际上,基于路径交换的反悔原理,直接跑残量网络是没问题的。

代码里面偷了懒,万一有免费的边就错了


Code:

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=1010;
const int M=10010;
const int inf=0x3f3f3f3f;
int head[N],edge[M<<1],cost[M<<1],to[M<<1],Next[M<<1],cnt=1;
void add(int u,int v,int w,int c)
{
edge[++cnt]=w;cost[cnt]=c;Next[cnt]=head[u];to[cnt]=v;head[u]=cnt;
edge[++cnt]=0;cost[cnt]=-c;Next[cnt]=head[v];to[cnt]=u;head[v]=cnt;
}
int maxflow,n,m,k;
int dep[N];
bool bfs()
{
memset(dep,0,sizeof(dep));
dep[1]=1;
queue <int > q;
q.push(1);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i;i=Next[i])
{
int v=to[i];
if(!cost[i]&&!dep[v]&&edge[i])
{
dep[v]=dep[u]+1;
if(v==n) return 1;
q.push(v);
}
}
}
return 0;
}
int dfs(int now,int flow)
{
if(now==n) return flow;
int rest=flow,k;
for(int i=head[now];i&&rest;i=Next[i])
{
int v=to[i];
if(!cost[i]&&edge[i]&&dep[v]==dep[now]+1)
{
k=dfs(v,min(rest,edge[i]));
if(!k) dep[v]=0;
rest-=k;
edge[i]-=k;
edge[i^1]+=k;
}
}
return flow-rest;
}
void Dinic()
{
int flow=0;
while(bfs())
while(flow=dfs(1,inf)) maxflow+=flow;
printf("%d ",maxflow);
}
int pre[N],used[N],dis[N];
int spfa()
{
queue <int > q;
q.push(0);
memset(dis,0x3f,sizeof(dis));
dis[0]=0;
while(!q.empty())
{
int u=q.front();
used[u]=0;
q.pop();
for(int i=head[u];i;i=Next[i])
{
int v=to[i];
if(edge[i]&&dis[v]>dis[u]+cost[i])
{
dis[v]=dis[u]+cost[i];
pre[v]=i;
if(!used[v])
used[v]=1,q.push(v);
}
}
}
return dis[n]!=inf;
}
void costflow()
{
int ans=0;
while(spfa())
{
int mi=inf;
for(int now=n;now;now=to[pre[now]^1])
mi=min(edge[pre[now]],mi);
ans+=dis[n]*mi;
for(int now=n;now;now=to[pre[now]^1])
edge[pre[now]]-=mi,edge[pre[now]^1]+=mi;
}
printf("%d\n",ans);
}
void init()
{
scanf("%d%d%d",&n,&m,&k);
int u,v,w,c;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&u,&v,&w,&c);
add(u,v,w,0),add(u,v,inf,c);
}
}
void work()
{
Dinic();
add(0,1,k,0);
costflow();
}
int main()
{
init();
work();
return 0;
}

2018.7.14

洛谷 P2604 [ZJOI2010]网络扩容 解题报告的更多相关文章

  1. 洛谷$P2604\ [ZJOI2010]$网络扩容 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 昂第一问跑个最大流就成不说$QwQ$ 然后第二问,首先原来剩下的边就成了费用为0的边?然后原来的所有边连接的两点都给加上流量为$inf$费用为$w$的边,保 ...

  2. [洛谷P2604][ZJOI2010]网络扩容

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

  3. 洛谷 P2604 [ZJOI2010]网络扩容

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

  4. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  5. 洛谷 P3171 [CQOI2015]网络吞吐量 解题报告

    P3171 [CQOI2015]网络吞吐量 题目描述 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最 ...

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

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

  7. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  8. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  9. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

随机推荐

  1. python爬虫:爬取慕课网视频

    前段时间安装了一个慕课网app,发现不用注册就可以在线看其中的视频,就有了想爬取其中的视频,用来在电脑上学习.决定花两天时间用学了一段时间的python做一做.(我的新书<Python爬虫开发与 ...

  2. 搜索引擎ElasticSearch系列(一): ElasticSearch2.4.4环境搭建

    一:ElasticSearch简介 Elasticsearch is a distributed, RESTful search and analytics engine capable of sol ...

  3. Maven学习(八)-----Maven依赖机制

    Maven依赖机制 在 Maven 依赖机制的帮助下自动下载所有必需的依赖库,并保持版本升级. 案例分析 让我们看一个案例研究,以了解它是如何工作的.假设你想使用 Log4j 作为项目的日志.这里你要 ...

  4. javaweb(十六)——JSP指令

    一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: pa ...

  5. 基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(中)

    接<基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)> 三.代码分析 1.界面初始化 bool PlaneWarGame::init() { bool bRet = fals ...

  6. 区块链技术:每位CEO都应了解

    区块链技术有可能成为一项广泛应用的突破性技术,像蒸汽机.电力或因特网那 样,改变整个社会和经济的运行方式. 对企业而言,信任至关重要.今天,我们基于信任,将钱存放在银行,通过电商企业 网购产品,并且依 ...

  7. Python数据结构 将列表作为栈和队列使用

    列表作为栈使用 Python列表方法使得列表作为堆栈非常容易,最后一个插入,最先取出(“后进先出”).要添加一个元素到堆栈的顶端,使用 append() .要从堆栈顶部取出一个元素,使用 pop()  ...

  8. Markdown分级语法手册

    目录 前言(可以不看) 基本语法(18) 1. 标题:# 2. 无序列表:- 3. 有序列表:1. 4. 斜体:* 5. 粗体:** 6. 加粗斜体:*** 7. 删除线:~~ 8. 分隔线:--- ...

  9. Centos 7 zabbix 实战应用

    实际需求:公司已经有了100台服务器,现在需要使用zabbix全部监控起来. 先出个方案(规划) 常规监控:cpu,内存,磁盘,网卡 问题:怎样快速添加100台机器         方法1:使用克隆的 ...

  10. hive 2以上版本启动异常 Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

    hive2.0以上的版本启动时 抛出 “Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreCli ...