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

求:

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

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

其中\(n \le 1000,m \le 5000,k \le 10\)

网络流题,复杂度都是没用的了....

第一问就是一个裸的最大流

现在我们考虑第二问QwQ

最小扩容费用,我们是不是可以对于原图中的\(u->v\)的边,添加一条\(u->v\),流量为\(inf\),费用为\(w\)的边,这样就可以实现扩容了。可是我们怎么限制最大流增加k呢?

我们可以新建一个t,然后从原来的\(t\)连向现在的t,费用为0,流量为\(maxflow+k\)的边,然后直接跑费用流即可

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue> using namespace std; inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
} const int maxn = 2018;
const int maxm = 1e6+1e2;
const int inf = 1e9; int n,m,k;
int x[maxm],y[maxm],w[maxm],f[maxm];
int point[maxn],nxt[maxm],to[maxm],cost[maxm],flow[maxm];
int pre[maxm];
int dis[maxn],vis[maxn];
int cnt=1;
int anscost,ansflow;
queue<int> q;
int s,t;
int from[maxn]; void addedge(int x,int y,int w,int f)
{
nxt[++cnt]=point[x];
to[cnt]=y;
cost[cnt]=w;
flow[cnt]=f;
pre[cnt]=x;
point[x]=cnt;
} void insert(int x,int y,int w,int f)
{
addedge(x,y,w,f);
addedge(y,x,-w,0);
} void init()
{
cnt=1;
memset(point,0,sizeof(point));
memset(dis,127/3,sizeof(dis));
memset(vis,0,sizeof(vis));
} bool spfa(int s)
{
memset(dis,127/3,sizeof(dis));
memset(vis,0,sizeof(vis));
vis[s]=1;
dis[s]=0;
q.push(s);
while(!q.empty())
{
int x = q.front();
q.pop();
vis[x]=0;
for (int i=point[x];i;i=nxt[i])
{
int p = to[i];
if (flow[i]>0 && dis[p]>dis[x]+cost[i])
{
from[p]=i;
dis[p]=dis[x]+cost[i];
if (!vis[p])
{
q.push(p);
vis[p]=1;
}
}
}
}
if (dis[t]>=dis[t+1]) return false;
else return true;
} void mcf()
{
int x= inf;
for (int i=from[t];i;i=from[pre[i]]) x=min(x,flow[i]);
ansflow+=x;
for (int i=from[t];i;i=from[pre[i]])
{
flow[i]-=x;
flow[i^1]+=x;
anscost+=cost[i]*x;
}
} void solve()
{
while (spfa(s))
{
mcf();
}
}
int main()
{
n=read();
m=read();
k=read();
s=1;
t=n;
for (int i=1;i<=m;i++) x[i]=read(),y[i]=read(),f[i]=read(),w[i]=read();
for (int i=1;i<=m;i++) insert(x[i],y[i],0,f[i]);
solve();
//cout<<ansflow<<endl;
int ff=ansflow;
ansflow=0;anscost=0;
init();
for (int i=1;i<=m;i++) insert(x[i],y[i],0,f[i]),insert(x[i],y[i],w[i],inf);
t=n+1;
insert(n,n+1,0,ff+k);
solve();
cout<<ff<<" "<<anscost;
return 0;
}

bzoj1834 ZJOI2010网络扩容(费用流)的更多相关文章

  1. BZOJ1834[ZJOI2010]网络扩容——最小费用最大流+最大流

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

  2. bzoj1834: [ZJOI2010]network 网络扩容 费用流

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

  3. [ZJOI2010][bzoj1834] 网络扩容 [费用流]

    题面 传送门 思路 第一问:无脑网络流跑一波 第二问: 先考虑一个贪心的结论:扩容出来的扩容流量一定要跑满 证明显然 因此我们可以把扩容费用可以换个角度思考,变成增加一点流量,花费W的费用 这样,我们 ...

  4. bzoj1834 [ZJOI2010]网络扩容

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

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

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

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

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

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

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

  8. [Luogu 2604] ZJOI2010 网络扩容

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

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

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

随机推荐

  1. rabbitMQ重复消费(结合死循环重发那一篇看)

    /** * 重复消费逻辑判断与处理 */ @Component public class RepeatMqConsumer { /** * 服务对象 */ private int count=1; @ ...

  2. 关于python使用的那些事儿

    时间:2019-04-11 整理:PangYuaner 标题:Python获取并输出当前日期时间 地址:https://www.cnblogs.com/kerwinC/p/5760811.html 实 ...

  3. Netty ServerBootstrap如何绑定端口

    这篇讲netty服务端ServerBootstrap如何启动 前言 BootStrap在netty的应用程序中负责引导服务器和客户端.netty包含了两种不同类型的引导: 使用服务器的ServerBo ...

  4. 关闭Redis服务

    方式1: 方式2:

  5. 手写AVL平衡二叉搜索树

    手写AVL平衡二叉搜索树 二叉搜索树的局限性 先说一下什么是二叉搜索树,二叉树每个节点只有两个节点,二叉搜索树的每个左子节点的值小于其父节点的值,每个右子节点的值大于其左子节点的值.如下图: 二叉搜索 ...

  6. Identity角色管理一(准备工作)

    因角色管理需要有用户才能进行(需要将用户从角色中添加,删除)故角色管理代码依托用户管理 只需在Startup服务中添加角色管理即可完成 public void ConfigureServices(IS ...

  7. 将给定数据源生成静态HTML页面持久化到项目之外的硬盘

    一.java代码 设置好数据源map Map<String,String> map=new HashMap<>(); map.put("knowledgeName&q ...

  8. python 打字小游戏

    最近随便用python的pygame编了这个打字小游戏 只要有字母调到窗口底部就结束 上代码: import pygame.freetype import sys import random pyga ...

  9. 【tp6】解决Driver [Think] not supported.

    使用助手函数view时会出现 解决方法:使用composer安装composer require topthink/think-view

  10. Jmeter系类(31) - JSR223(1) | 控件介绍

    JSR233 介绍 JSR223控件执行JSR223脚本代码用于创建/更新所需的某些变量 JSR223可以使用其内置的变量,有助于精简脚本,提高开发测试的效率 由于JSR223脚本编译方式基本相同,J ...