OJ题号:

BZOJ1834、洛谷2604

思路:

对于第一问,直接跑一遍最大流即可。
对于第二问,将每条边分成两种情况,即将每条边拆成两个:
不需扩容,即残量大于零时,相当于这条边费用为$0$;
需要扩容,即残量等于零时,可以扩容很多次,将残量设为$inf$或者$k$(实际上最多扩容$k$次)。
由于$k≤10$,跑$k$遍流量为$1$的最小费用流即可。

 #include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstring>
inline int getint() {
char ch;
while(!isdigit(ch=getchar()));
int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int inf=0x7fffffff;
int n,m,k,s,t;
struct Edge {
int from,to,remain,cost;
};
const int E=,V=;
Edge e[E];
std::vector<int> g[V];
int sz=;
inline void add_edge(const int u,const int v,const int w,const int c) {
e[sz]=(Edge){u,v,w,c};
g[u].push_back(sz);
sz++;
}
int p[V],a[V];
inline int MFAugment() {
memset(a,,sizeof a);
a[s]=inf;
std::queue<int> q;
q.push(s);
while(!q.empty()&&!a[t]) {
int x=q.front();
q.pop();
for(unsigned i=;i<g[x].size();i++) {
Edge &y=e[g[x][i]];
if(!a[y.to]&&y.remain) {
p[y.to]=g[x][i];
a[y.to]=std::min(a[x],y.remain);
q.push(y.to);
}
}
}
return a[t];
}
inline int MF() {
int maxflow=;
while(int flow=MFAugment()) {
for(int i=t;i!=s;i=e[p[i]].from) {
e[p[i]].remain-=flow;
e[p[i]^].remain+=flow;
}
maxflow+=flow;
}
return maxflow;
}
int d[V];
bool inq[V];
inline int MCAugment() {
d[s]=;
for(int i=;i<=t;i++) d[i]=inf;
std::queue<int> q;
q.push(s);
memset(inq,,sizeof inq);
inq[s]=true;
while(!q.empty()) {
int x=q.front();
q.pop();
inq[x]=false;
for(unsigned i=;i<g[x].size();i++) {
Edge &y=e[g[x][i]];
if((d[x]+y.cost<d[y.to])&&y.remain&&(y.cost>=)) {
d[y.to]=d[x]+y.cost;
p[y.to]=g[x][i];
if(!inq[y.to]) {
q.push(y.to);
inq[y.to]=true;
}
}
}
}
return d[t];
}
inline int MC() {
int mincost=;
while(k--) {
int cost=MCAugment();
for(int i=t;i!=s;i=e[p[i]].from) {
e[p[i]].remain--;
e[p[i]^].remain++;
}
mincost+=cost;
}
return mincost;
}
int main() {
n=getint(),m=getint(),k=getint();
s=,t=n;
while(m--) {
int u=getint(),v=getint(),w=getint(),c=getint();
add_edge(u,v,w,c);
add_edge(v,u,,-c);
}
printf("%d ",MF());
int oldsz=sz;
for(int i=;i<oldsz;i++) {
int u=e[i].from,v=e[i].to,w=e[i].remain,c=e[i].cost;
e[i]=(Edge){u,v,w,};
add_edge(u,v,inf,c);
}
printf("%d\n",MC());
return ;
}

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

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

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

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

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

  3. [Luogu 2604] ZJOI2010 网络扩容

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

  4. ZJOI2010网络扩容

    无限orz hzwer神牛…… 第一问很简单,按数据建图,然后一遍最大流算法即可.     第二问则需要用最小费用最大流算法,主要是建图,那么可以从第一问的残留网络上继续建图,对残留网络上的每一条边建 ...

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

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

  6. 1834. [ZJOI2010]网络扩容【费用流】

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

  7. BZOJ1834:[ZJOI2010]网络扩容——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1834 https://www.luogu.org/problemnew/show/P2604#sub ...

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

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

  9. bzoj1834 [ZJOI2010]网络扩容

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

随机推荐

  1. R-CNN论文详解(转载)

    这几天在看<Rich feature hierarchies for accurate object detection and semantic segmentation >,觉得作者的 ...

  2. __ATTR引发的编译错误【原创】

    有一天我编译内核模块驱动的时候发现如下错误 Linux kernel版本:4.1.15 error: negative width in bit-field '<anonymous>' 代 ...

  3. C++:STL vector:sizeof(vector)

    原文地址:http://blog.csdn.net/zcsylj/article/details/7857009 int的大小是4,定义vector<int> vec,vec中有一个元素, ...

  4. oracle 存储过程 clob 字段 调试

    clob 没法直接赋值调试,可以新建一个存储过程,赋值给clob字段,然后调试

  5. oracle flashback 后主键及索引更改问题

    oracle flashback 后 主键会变为bin开头,如果删除可以采用将sql复制出单独窗口,然后加上“”执行

  6. Python中的一些小语法

    目录: 生成随机数 将一个字符串变为datetime类型,并且获取星期几 1.生成随机数 假设我们要操作的list如下: >>> import random >>> ...

  7. matplotlib画图

    matplotlib画图 import numpy as np import matplotlib.pyplot as plt x1=[20,33,51,79,101,121,132,145,162, ...

  8. Oracle 数据库逻辑结构

    注:本文来源于 <腾科OCP培训课堂>.非准许商业活动. Oracle 数据库逻辑结构 一.存储关系 Oracle 数据库逻辑上是由一个或多个表空间组成的,表空间物理上是由一个或多个数据 ...

  9. LeetCode(63):不同路径 II

    Medium! 题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“F ...

  10. wpf Assembly.LoadFile dll GetType 反射 抛异常 不具有由 URI 识别的资源。

    public static void LoadViewFromUri(this Window window, string baseUri) { try { var resourceLocater = ...