【题目链接】

http://www.lydsy.com/JudgeOnline/problem.php?id=1834

【题意】

给定一个有向图,每条边有容量C,扩容费用W,问最大流和使容量增加K的最少扩容费用。

【思路】

第一问就是费用为0的费用流

第二问在第一问的残量网络上操作,对于每条边都新加一条容量为inf,且费用为W的边。至于容量增加K,只要新建一个S点向1连一条容量为K费用为0的边即可。然后跑一遍最小费用最大流。

【代码】

 #include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long ll;
const int N = 1e3+;
const int inf = 2e9; ll read() {
char c=getchar();
ll f=,x=;
while(!isdigit(c)) {
if(c=='-') f=-; c=getchar();
}
while(isdigit(c))
x=x*+c-'',c=getchar();
return x*f;
} struct Edge { int u,v,cap,flow,cost,t;
}; struct MCMF {
int n,m,s,t;
int a[N],inq[N],d[N],p[N];
queue<int> q;
vector<Edge> es;
vector<int> g[N];
void init(int n) {
this->n=n;
es.clear();
for(int i=;i<=n;i++) g[i].clear();
}
void AddEdge(int u,int v,int w,int c,int f) {
es.push_back((Edge){u,v,w,,f*c,c});
es.push_back((Edge){v,u,,,-f*c,c});
int m=es.size();
g[u].push_back(m-);
g[v].push_back(m-);
}
bool spfa(int s,int t,int& flow,int& cost) {
memset(inq,,sizeof(inq));
for(int i=;i<=n;i++) d[i]=inf;
q.push(s);
inq[s]=,a[s]=inf,d[s]=;
while(!q.empty()) {
int u=q.front(); q.pop();
inq[u]=;
for(int i=;i<g[u].size();i++) {
Edge& e=es[g[u][i]];
int v=e.v;
if(e.cap>e.flow && d[v]>d[u]+e.cost) {
d[v]=d[u]+e.cost;
p[v]=g[u][i];
a[v]=min(a[u],e.cap-e.flow);
if(!inq[v])
inq[v]=,
q.push(v);
}
}
}
if(d[t]==inf) return ;
flow+=a[t],cost+=a[t]*d[t];
for(int x=t;x!=s;x=es[p[x]].u) {
es[p[x]].flow+=a[t];
es[p[x]^].flow-=a[t];
}
return ;
}
void mcmf(int s,int t,int& flow,int& cost) {
flow=cost=;
while(spfa(s,t,flow,cost)) ;
}
} mc; int n,m,K; int main()
{
n=read(),m=read(),K=read();
mc.init(n+);
int S=,T=n;
int u,v,w,c;
FOR(i,,m) {
u=read(),v=read(),w=read(),c=read();
mc.AddEdge(u,v,w,c,);
}
int flow,cost;
mc.mcmf(,n,flow,cost);
printf("%d ",flow);
int mx=mc.es.size();
for(int i=;i<mx;i+=) {
Edge e=mc.es[i];
mc.AddEdge(e.u,e.v,inf,e.t,);
}
mc.AddEdge(S,,K,,);
mc.mcmf(S,T,flow,cost);
printf("%d",cost);
return ;
}

bzoj 1834 [ZJOI2010]network 网络扩容(MCMF)的更多相关文章

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

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

  2. bzoj 1834: [ZJOI2010]network 网络扩容 -- 最大流+费用流

    1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec  Memory Limit: 64 MB Description 给定一张有向图,每条边都有一个容量C和一 ...

  3. BZOJ 1834 [ZJOI2010]network 网络扩容(费用流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1834 [题目大意] 给定一张有向图,每条边都有一个容量C和一个扩容费用W. 这里扩容费 ...

  4. bzoj 1834: [ZJOI2010]network 网络扩容

    #include<cstdio> #include<iostream> #include<cstring> #define M 100000 #define inf ...

  5. BZOJ 1834: [ZJOI2010]network 网络扩容 最小费用流_最大流_残量网络

    对于第一问,跑一遍最大流即可. 对于第二问,在残量网络上的两点间建立边 <u,v>,容量为无限大,费用为扩充费用. 跑一遍最小费用流即可. Code: #include <vecto ...

  6. BZOJ 1834: [ZJOI2010]network 网络扩容(网络流+费用流)

    一看就知道是模板题= = ,不说什么了= = PS:回去搞期末了,暑假再来刷题了 CODE: #include<cstdio> #include<iostream> #incl ...

  7. bzoj 1834: [ZJOI2010]network 网络扩容【最大流+最小费用最大流】

    第一问直接跑最大流即可.建图的时候按照费用流建,费用为0. 对于第二问,在第一问dinic剩下的残量网络上建图,对原图的每条边(i,j),建(i,j,inf,cij),表示可以用c的花费增广这条路.然 ...

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=1834 我又思考人生了T_T,nd的数组开小了,一直wa,调了一个小时才发现啊!!!!!我一直以为我的 ...

  9. 【BZOJ】1834 [ZJOI2010]network 网络扩容

    [算法]网络流-最大流+最小费用最大流(费用流) [题解] 第一问跑最大流. 第二问: 原始边相当于费用为0的边,再原图(跑过最大流的图)基础上添加带费用的边,容量为k(相当于inf). 第一问最大流 ...

随机推荐

  1. spring +hibernate 启动优化【转】

    最近在负责一个大项目,项目组成员包括项目经理大概10个人左右.项目技术用struts+spring+hibernate实现.项目的规模相对来说是比较大的,总共有10大模块,每个大模块又分为有十几个.甚 ...

  2. obj转换成数组

    原则上obj是不能转换成数组的.首先array也是obj.只是一个特殊的object. obj一个很关键的点,是拥有成员和方法,撇开方法不说,obj就是一个key-value结构.也就是哈希数组,而j ...

  3. Monad学习

    这是观看Cousera上的课程<Principles of Reactive Programming>中week1里的Monad一节所做的笔记. What is a Monad? What ...

  4. CentOS 5: Make Command not Found

    在centos 5下安装软件遇到的问题,google了一圈,是因为系统没有安装编译器,那安装就是了,嘿嘿. 解决办法,在SSH下输入下面的命令 yum -y install gcc automake ...

  5. A JSTL primer, Part 2: Getting down to the core

    In the initial article of this series, you got your first look at JSTL. We described the use of its  ...

  6. Servlet课程0426(九)Servlet服务器端创建Cookie和客户端读取Cookie

    服务器端创建Cookie: Win7默认Cookie位置 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Cookies Cookie ...

  7. HeadFirst设计模式之模板方法模式

    一. 1.The Template Method defines the steps of an algorithm and allows subclasses to provide the impl ...

  8. HeadFirst设计模式之命令模式

    一. 1.因为是操作经常变化,所以封装操作为command对象.You can do that by introducing “command objects” into your design. A ...

  9. 102. Binary Tree Level Order Traversal

    题目: Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to ri ...

  10. 验证Android用户输入日期

    如何验证用户输入的日期是有效还是无效? private Pattern pattern; private Matcher matcher; private static final String DA ...