BZOJ 1834: [ZJOI2010]network 网络扩容 最小费用流_最大流_残量网络
对于第一问,跑一遍最大流即可.
对于第二问,在残量网络上的两点间建立边 <u,v>,容量为无限大,费用为扩充费用.
跑一遍最小费用流即可.
Code:
#include <vector>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#define setIO(s) freopen(s".in","r",stdin)
#define inf 100000000
#define maxn 100000
#define ll long long
using namespace std;
struct Edges{
int u,v,c,w;
}EDGE[maxn];
int n,m,k,s,t;
struct Edge{
int from,to,cap,cost;
Edge(int u,int v,int c,int f) : from(u),to(v),cap(c),cost(f){}
};
vector<int>G[maxn];
vector<Edge>edges;
void addedge(int u,int v,int c,int f){
edges.push_back(Edge(u,v,c,f));
edges.push_back(Edge(v,u,0,-f));
int o = edges.size();
G[u].push_back(o - 2);
G[v].push_back(o - 1);
}
namespace Dinic{
int d[maxn],vis[maxn];
queue<int>Q;
int BFS(){
memset(vis,0,sizeof(vis));
vis[s] = 1,d[s] = 0; Q.push(s);
while(!Q.empty()){
int u = Q.front(); Q.pop();
int sz = G[u].size();
for(int i=0;i<sz;++i) {
Edge r = edges[G[u][i]];
if(!vis[r.to] && r.cap > 0) {
d[r.to] = d[u] + 1;
vis[r.to] = 1;
Q.push(r.to);
}
}
}
return vis[t];
}
int current[maxn];
int DFS(int x,int cur){
if(x==t) return cur;
int flow=0,f;
int sz = G[x].size();
for(int i=current[x];i<sz;++i) {
int u = G[x][i];
Edge r = edges[u];
if(d[r.to] == d[x] + 1 && r.cap > 0){
f = DFS(r.to,min(cur,r.cap));
if(f > 0) {
flow += f;
cur -= f;
edges[u].cap -= f;
edges[u^1].cap += f;
}
}
if(cur==0) break;
}
return flow;
}
int maxflow(){
int flow=0;
while(BFS()){
memset(current,0,sizeof(current));
flow += DFS(s,inf);
}
return flow;
}
};
namespace MCMF{
queue<int>Q;
int d[maxn],inq[maxn];
int flow2[maxn],a[maxn];
long long ans;
int SPFA(){
for(int i=0;i<maxn;++i) d[i] = flow2[i] = inf;
memset(inq,0,sizeof(inq));
inq[s] = 1; d[s] = 0;
Q.push(s);
while(!Q.empty()){
int u=Q.front();Q.pop(); inq[u] = 0;
int sz = G[u].size();
for(int i=0;i<sz;++i) {
Edge r = edges[G[u][i]];
if(r.cap > 0 && d[r.to] > d[u] + r.cost) {
d[r.to] = d[u] + r.cost;
a[r.to] = G[u][i];
flow2[r.to] = min(flow2[u],r.cap);
if(!inq[r.to]) {
inq[r.to] = 1;
Q.push(r.to);
}
}
}
}
if(flow2[t] == inf) return 0;
int f = flow2[t];
edges[a[t]].cap -= f, edges[a[t] ^ 1].cap += f;
int u = edges[a[t]].from;
while(u != s){
edges[a[u]].cap -= f;
edges[a[u]^1].cap += f;
u = edges[a[u]].from;
}
ans += (ll)(d[t] * f);
return 1;
}
long long getcost(){
while(SPFA());
return ans;
}
};
int main(){
//setIO("input");
scanf("%d%d%d",&n,&m,&k);
s = 1, t = n;
for(int i = 1;i <= m; ++i) scanf("%d%d%d%d",&EDGE[i].u,&EDGE[i].v,&EDGE[i].c,&EDGE[i].w);
for(int i = 1;i <= m; ++i)
addedge(EDGE[i].u,EDGE[i].v,EDGE[i].c,0);
printf("%d ",Dinic::maxflow());
for(int i = 1;i <= m; ++i)
addedge(EDGE[i].u,EDGE[i].v,inf,EDGE[i].w);
s = 0 , t = n + 1;
addedge(s,1,k,0);
addedge(n,n+1,k,0);
printf("%lld",MCMF::getcost());
return 0;
}
BZOJ 1834: [ZJOI2010]network 网络扩容 最小费用流_最大流_残量网络的更多相关文章
- BZOJ 1834: [ZJOI2010]network 网络扩容(最大流+最小费用最大流)
第一问直接跑最大流.然后将所有边再加一次,费用为扩容费用,容量为k,再从一个超级源点连一条容量为k,费用为0的边到原源点,从原汇点连一条同样的边到超级汇点,然 后跑最小费用最大流就OK了. ---- ...
- bzoj 1834: [ZJOI2010]network 网络扩容 -- 最大流+费用流
1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Description 给定一张有向图,每条边都有一个容量C和一 ...
- bzoj 1834 [ZJOI2010]network 网络扩容(MCMF)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1834 [题意] 给定一个有向图,每条边有容量C,扩容费用W,问最大流和使容量增加K的最 ...
- bzoj 1834: [ZJOI2010]network 网络扩容【最大流+最小费用最大流】
第一问直接跑最大流即可.建图的时候按照费用流建,费用为0. 对于第二问,在第一问dinic剩下的残量网络上建图,对原图的每条边(i,j),建(i,j,inf,cij),表示可以用c的花费增广这条路.然 ...
- 最小割最大流定理&残量网络的性质
最小割最大流定理的内容: 对于一个网络流图 $G=(V,E)$,其中有源点和汇点,那么下面三个条件是等价的: 流$f$是图$G$的最大流 残量网络$G_f$不存在增广路 对于$G$的某一个割$(S,T ...
- BZOJ 1834 [ZJOI2010]network 网络扩容(费用流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1834 [题目大意] 给定一张有向图,每条边都有一个容量C和一个扩容费用W. 这里扩容费 ...
- bzoj 1834: [ZJOI2010]network 网络扩容
#include<cstdio> #include<iostream> #include<cstring> #define M 100000 #define inf ...
- BZOJ 1834: [ZJOI2010]network 网络扩容(网络流+费用流)
一看就知道是模板题= = ,不说什么了= = PS:回去搞期末了,暑假再来刷题了 CODE: #include<cstdio> #include<iostream> #incl ...
- BZOJ 1834 ZJOI2010 network 网络扩展 Dinic+EK费用流
标题效果:给定一个n积分m无向图边,每一方有一个扩展的成本c.代表扩张1费用的交通,寻求最大流量和扩大的最大流量k最小成本 第一问直接运行的最大流量 第二个问题将是连接到一个流的末端每个边缘的起点是正 ...
随机推荐
- websocket 进阶!netty框架实现websocket达到高并发
引言: 在前面两篇文章中,我们对原生websocket进行了了解,且用demo来简单的讲解了其用法.但是在实际项目中,那样的用法是不可取的,理由是tomcat对高并发的支持不怎么好,特别是tomcat ...
- Map之HashMap的get与put流程,及hash冲突解决方式
在java中HashMap作为一种Map的实现,在程序中我们经常会用到,在此记录下其中get与put的执行过程,以及其hash冲突的解决方式: HashMap在存储数据的时候是key-value的键值 ...
- 安装和启动Elasticseach
1.在windows上安装和启动Elasticseach 1.安装JDK,至少1.8.0_73以上版本,java -version2.下载和解压缩Elasticsearch安装包.Elasticsea ...
- Win 10安装mysql以及常见问题总结
一.mysql免安装版本配置1.从官网下载安装包,解压后,在电脑属性环境变量的path中配置bin的路径 2.配置my.ini [mysql] # 设置mysql客户端默认字符集 default-ch ...
- GROUP BY GROUPING SETS 示例
--建表 create table TEst1 ( ID ), co_CODE ), T_NAME ), Money INTEGER, P_code ) ); --插入基础数据 insert into ...
- WEBGL学习【六】动起来的三棱锥和立方体
<html lang="zh-CN"> <!--服务器运行地址:http://127.0.0.1:8080/webgl/LearnNeHeWebGL/NeHeWe ...
- 人脸识别中的harr特征提取(转)
影响AdaBoost人脸检测训练算法速度很重要的两方面是特征选取和特征计算.选取的特征为矩特征为Haar特征,计算的方法为积分图. (1)Haar特征: Haar特征分为三类:边缘特征.线性特 ...
- 原生js,一些小应用(逢10进一,生成V字,多个div抖动)
第一题:每隔10个div换一行.并且鼠标移入 改变opacity. <!DOCTYPE html> <html lang="en"> <head> ...
- 2015 Multi-University Training Contest 7 hdu 5378 Leader in Tree Land
Leader in Tree Land Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- JS中的call()(转)
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方 ...