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

  求: 1.在不扩容的情况下,1到N的最大流; 2.将1到N的最大流增加K所需的最小费用。

题解:先跑最大流,在残余网络上跑费用流

卡点:

C++ Code:

#include<cstdio>
#include<cctype>
#include<cstring>
#define maxn 5010
using namespace std;
const int inf=0x3f3f3f3f;
int n,m,k;
int u[5010],v[5010],w[5010],c[5010];
int d[maxn],pre[maxn];
int q[maxn],h,t;
int st=1,ed;
int head[maxn],cnt=2;
struct Edge{
int to,nxt,w,cost;
}e[5010<<2];
bool vis[maxn];
char ch;
void read(int &x){
ch=getchar();
while (!isdigit(ch))ch=getchar();
for (x=ch^48,ch=getchar();isdigit(ch);ch=getchar())x=x*10+(ch^48);
}
inline int min(int a,int b){return a<b?a:b;}
void add(int a,int b,int c,int d){
e[cnt]=(Edge){b,head[a],c,d};head[a]=cnt;
e[cnt^1]=(Edge){a,head[b],0,-d};head[b]=cnt^1;
cnt+=2;
}
bool bfs(){
memset(d,0,sizeof d);
d[q[h=t=1]=st]=1;
while (h<=t){
int x=q[h++];
if (x==ed)return true;
for (int i=head[x];i;i=e[i].nxt){
int to=e[i].to;
if ((!d[to])&&e[i].w){
d[to]=d[x]+1;
q[++t]=to;
}
}
}
return d[ed];
}
int dfs(int x,int low){
if (x==ed||!low)return low;
int res=0,w;
for (int i=head[x];i;i=e[i].nxt){
int to=e[i].to;
if ((d[to]==d[x]+1)&&e[i].w){
w=dfs(to,min(low-res,e[i].w));
e[i].w-=w;
e[i^1].w+=w;
res+=w;
if (res==low)return res;
}
}
if (!res)d[x]=-1;
return res;
}
void dinic(){
int ans=0;
while (bfs())ans+=dfs(st,inf);
printf("%d ",ans);
}
bool spfa(){
memset(d,0x3f,sizeof d);
d[st]=0;
vis[q[h=t=1]=st]=true;
while (h<=t){
int x=q[h++];vis[x]=false;
for (int i=head[x];i;i=e[i].nxt){
int to=e[i].to;
if (e[i].w&&d[to]>d[x]+e[i].cost){
d[to]=d[x]+e[i].cost;
pre[to]=i;
if (!vis[to]){
vis[to]=true;
q[++t]=to;
}
}
}
}
return d[ed]!=inf;
}
int update(){
int ans,mf=inf;
for (int i=pre[ed];i;i=pre[e[i^1].to])mf=min(mf,e[i].w);
ans=mf*d[ed];
for (int i=pre[ed];i;i=pre[e[i^1].to])e[i].w-=mf,e[i^1].w+=mf;
return ans;
}
void MCMF(){
int ans=0;
while (spfa())ans+=update();
printf("%d\n",ans);
}
int main(){
read(n),read(m),read(k);
ed=n;
for (int i=1;i<=m;i++)read(u[i]),read(v[i]),read(c[i]),read(w[i]),add(u[i],v[i],c[i],0);
dinic();
for (int i=1;i<=m;i++)add(u[i],v[i],inf,w[i]);
st=0;
add(st,1,k,0);
MCMF();
return 0;
}

  

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

  1. 洛谷 P2604 [ZJOI2010]网络扩容 解题报告

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

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

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

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

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

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

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

  5. BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)

    题目连接: (luogu) https://www.luogu.org/problemnew/show/P2604 (bzoj) https://www.lydsy.com/JudgeOnline/p ...

  6. P2604 [ZJOI2010]网络扩容

    思路 简单的费用流问题,跑出第一问后在残量网络上加边求最小费用即可 代码 #include <cstdio> #include <algorithm> #include < ...

  7. 洛谷 P1546 最短网络 Agri-Net

    题目链接 https://www.luogu.org/problemnew/show/P1546 题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当 ...

  8. [Luogu 2604] ZJOI2010 网络扩容

    [Luogu 2604] ZJOI2010 网络扩容 第一问直接最大流. 第二问,添加一遍带费用的边,边权 INF,超级源点连源点一条容量为 \(k\) 的边来限流,跑费用流. 大约是第一次用 nam ...

  9. 洛谷P1546 最短网络 Agri-Net(最小生成树,Kruskal)

    洛谷P1546 最短网络 Agri-Net 最小生成树模板题. 直接使用 Kruskal 求解. 复杂度为 \(O(E\log E)\) . #include<stdio.h> #incl ...

随机推荐

  1. 关于<meta name="viewport" content="width= device-width,user-scalable= 0,initial-scale= 1.0,minimum-scale= 1.0">

    <meta name="viewport" content=" width= device-width, user-scalable= 0, initial-sca ...

  2. 分享一个PC端六格密码输入框写法

    如图.我们一般做商城类的项目不免会用到支付密码输入框,我研究了下并决定发上来,也当作是自己成长路上的一点小小的记录.本次介绍的是基于vue的项目 html: <template> < ...

  3. Centos7安装FastDFS

    离线安装包准备: 将相关的安装包上传到 /usr/local 目录,安装包下载 并解压到当前目录 1.安装 gcc yum install -y gcc gcc-c++ 2.安装 perl yum i ...

  4. Hive(1)-基本概念

    一. 什么是Hive Hive:由Facebook开源用于解决海量结构化日志的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能. 本 ...

  5. 2.1 进程控制之fork创建子进程

    fork()函数 目标:熟悉fork创建一个和多个子进程子线程 函数原型:pid_t fork(void); 返回值:成功返回:① 父进程返回子进程的ID(非负) ②子进程返回 0 : 失败返回-1. ...

  6. JavaScript之原型 Prototype

    1.我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype.这个属性对应着一个对象,这个对象就是我们所谓的原型对象.如果函索作为普通函数调用prototype没有任何作用. 当函数以 ...

  7. 将List中的数据更新到数据库中

    List中有相应的数据,更新到数据库如下: 1.根据关键字查找后删除: foreach (var item in objSelList) { ADDaAn da = db.ADDaAns.Find(i ...

  8. Git中从远程的分支获取最新的版本到本地——两种命令

    Git中从远程的分支获取最新的版本到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge Git fetch origin master git log ...

  9. Messy Code in Windows Server 2008 R2 English Edition

          We always use Windows Server 2008 R2 English operation system. And it doesn't have any problem ...

  10. JMeter上传图片

    JMeter怎样上传图片? 请注意图片的路径要与.jmx脚本的目录保持一致, 或者放在JMeter的bin目录下. 协议:http 服务器名称或IP:www.abcdef.com 方法:POST 路径 ...