【BZOJ1834】network 网络扩容(最大流,费用流)
题意:给定一张有向图,每条边都有一个容量C和一个扩容费用W。这里扩容费用是指将容量扩大1所需的费用。
求: 1、 在不扩容的情况下,1到N的最大流;
2、 将1到N的最大流增加K所需的最小扩容费用。
30%的数据中,N<=100
100%的数据中,N<=1000,M<=5000,K<=10
思路:RYZ作业
第一问最大流即可
第二问网上很多题解都是在第一问的残余网络上构图,但是根本不需要
考虑边(x,y,z,w)
有容量为z,费用为0的免费流量,有容量为INF,费用为w的扩容付费流量,连这两种边
又因为求的是最大流为ans1+k时的最小费用,所以需要建立一个新的源点,从n连一条容量为ans1+k,费用为0的边来限制流量
费用流经典模型之一(模板?)
- var head,vet,next,len1,len2,fan,x,y,z,w:array[..]of longint;
- pre:array[..,..]of longint;
- dis,gap,q:array[..]of longint;
- inq:array[..]of boolean;
- n,m,ans1,ans2,tot,i,src,source,s,k:longint;
- procedure add(a,b,c,d:longint);
- begin
- inc(tot);
- next[tot]:=head[a];
- vet[tot]:=b;
- len1[tot]:=c;
- len2[tot]:=d;
- head[a]:=tot;
- inc(tot);
- next[tot]:=head[b];
- vet[tot]:=a;
- len1[tot]:=;
- len2[tot]:=-d;
- head[b]:=tot;
- end;
- function min(x,y:longint):longint;
- begin
- if x<y then exit(x);
- exit(y);
- end;
- function dfs(u,aug:longint):longint;
- var e,v,val,t,flow:longint;
- begin
- if u=src then exit(aug);
- e:=head[u]; flow:=; val:=s-;
- while e<> do
- begin
- v:=vet[e];
- if len1[e]> then
- begin
- if dis[u]=dis[v]+ then
- begin
- t:=dfs(v,min(len1[e],aug-flow));
- len1[e]:=len1[e]-t;
- len1[fan[e]]:=len1[fan[e]]+t;
- flow:=flow+t;
- if dis[source]>=s then exit(flow);
- if aug=flow then break;
- end;
- val:=min(val,dis[v]);
- end;
- e:=next[e];
- end;
- if flow= then
- begin
- dec(gap[dis[u]]);
- if gap[dis[u]]= then dis[source]:=s;
- dis[u]:=val+;
- inc(gap[dis[u]]);
- end;
- exit(flow);
- end;
- function maxflow:longint;
- var ans:longint;
- begin
- fillchar(gap,sizeof(gap),);
- fillchar(dis,sizeof(dis),);
- gap[]:=s; ans:=;
- while dis[source]<s do ans:=ans+dfs(source,maxlongint);
- exit(ans);
- end;
- function spfa:boolean;
- var t,u,e,v,i,w:longint;
- begin
- for i:= to s do
- begin
- dis[i]:=maxlongint>>;
- inq[i]:=false;
- end;
- t:=; w:=; q[]:=source; inq[source]:=true; dis[source]:=;
- while t<w do
- begin
- inc(t); u:=q[t mod ];
- inq[u]:=false;
- e:=head[u];
- while e<> do
- begin
- v:=vet[e];
- if (len1[e]>)and(dis[u]+len2[e]<dis[v]) then
- begin
- pre[v,]:=u;
- pre[v,]:=e;
- dis[v]:=dis[u]+len2[e];
- if not inq[v] then
- begin
- inc(w); q[w mod ]:=v; inq[v]:=true;
- end;
- end;
- e:=next[e];
- end;
- end;
- if dis[src]=maxlongint>> then exit(false);
- exit(true);
- end;
- procedure mcf;
- var k,e,t:longint;
- begin
- k:=src; t:=maxlongint;
- while k<>source do
- begin
- t:=min(t,len1[pre[k,]]);
- k:=pre[k,];
- end;
- k:=src;
- while k<>source do
- begin
- e:=pre[k,];
- len1[e]:=len1[e]-t;
- len1[fan[e]]:=len1[fan[e]]+t;
- ans2:=ans2+t*len2[e];
- k:=pre[k,];
- end;
- end;
- begin
- assign(input,'bzoj1834.in'); reset(input);
- assign(output,'bzoj1834.out'); rewrite(output);
- readln(n,m,k);
- for i:= to do
- if i and = then fan[i]:=i+
- else fan[i]:=i-;
- for i:= to m do
- begin
- readln(x[i],y[i],z[i],w[i]);
- add(x[i],y[i],z[i],w[i]);
- end;
- source:=; src:=n; s:=n;
- ans1:=maxflow;
- fillchar(head,sizeof(head),);
- tot:=;
- for i:= to m do
- begin
- add(x[i],y[i],z[i],);
- add(x[i],y[i],maxlongint,w[i]);
- end;
- write(ans1,' ');
- inc(src); inc(s);
- add(n,src,ans1+k,);
- while spfa do mcf;
- write(ans2);
- close(input);
- close(output);
- end.
【BZOJ1834】network 网络扩容(最大流,费用流)的更多相关文章
- BZOJ 1834: [ZJOI2010]network 网络扩容(网络流+费用流)
一看就知道是模板题= = ,不说什么了= = PS:回去搞期末了,暑假再来刷题了 CODE: #include<cstdio> #include<iostream> #incl ...
- BZOJ1834 [ZJOI2010]network 网络扩容(最小费用最大流)
挺直白的构图..最小费用最大流的定义. #include<cstdio> #include<cstring> #include<queue> #include< ...
- BZOJ 1834: [ZJOI2010]network 网络扩容 最小费用流_最大流_残量网络
对于第一问,跑一遍最大流即可. 对于第二问,在残量网络上的两点间建立边 <u,v>,容量为无限大,费用为扩充费用. 跑一遍最小费用流即可. Code: #include <vecto ...
- BZOJ 1834 ZJOI2010 network 网络扩展 Dinic+EK费用流
标题效果:给定一个n积分m无向图边,每一方有一个扩展的成本c.代表扩张1费用的交通,寻求最大流量和扩大的最大流量k最小成本 第一问直接运行的最大流量 第二个问题将是连接到一个流的末端每个边缘的起点是正 ...
- 洛谷P2604 网络扩容 拆点+费用流
原题链接 这题貌似比较水吧,最简单的拆点,直接上代码了. #include <bits/stdc++.h> using namespace std; #define N 1000 #def ...
- bzoj-1834 network 网络扩容 【网络流】
这题就是复习下网络流. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i <= b; i++) #def ...
- BZOJ1834 [ZJOI2010]network 网络扩容 【最大流,费用流】
1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 3394 Solved: 1774 [Subm ...
- [BZOJ1834][ZJOI2010]network 网络扩容 最大流+费用流
1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 3330 Solved: 1739 [Subm ...
- 【最大流】【费用流】bzoj1834 [ZJOI2010]network 网络扩容
引用题解: 最大流+费用流. 第一问最大流即可. 第二问为“最小费用最大流”. 由题意,这一问的可转化为在上一问的“残量网络”上,扩大一些边的容量,使能从新的图中的最大流为k. 那么易得:对于还有剩余 ...
- 【BZOJ1834】[ZJOI2010]network 网络扩容 最大流+最小费用流
[BZOJ1834][ZJOI2010]network 网络扩容 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不 ...
随机推荐
- CF778A(round 402 div.2 D) String Game
题意: Little Nastya has a hobby, she likes to remove some letters from word, to obtain another word. B ...
- P2142 高精度减法
题目描述 高精度减法 输入输出格式 输入格式: 两个整数a,b(第二个可能比第一个大) 输出格式: 结果(是负数要输出负号) 输入输出样例 输入样例#1: 2 1 输出样例#1: 1 说明 20%数据 ...
- js事件、Js中的for循环和事件的关系、this
一.js事件 1.事件 用户在网页中所触发的行为 鼠标滑动种类很多,键盘.表单特列: 点击:onclick 鼠标进入:onmouseenter 鼠标离开:onmouseleave 鼠标悬浮:onmo ...
- Can't locate ExtUtils/MakeMaker.pm in @INC
Can't locate ExtUtils/MakeMaker.pm in @INC 解决办法:yum install perl-devel
- Dreamoon and MRT(二元枚举)
题目 数轴上有M个点a1.a2....am,另有一个数列p1.p2....pn,(1 ≤ pii ≤ M). 给定d1.d2....dn,对所有的 i (1 ≤ i ≤ n),已知 |api+1 - ...
- axure使用经验
泛化不常用======伸展也是拉动原件收缩也是拉动原件====== 动态模板相互影响(有的时候会出现这个问题,只需要设置两者的高度,不让两者有包含关系(一点点可以有):====== 实现高级菜单栏(同 ...
- flask_第一个程序
安装flask sudo pip3 install flask falsk最小应用 from flask import Flask app = Flask(__name__) @app.route(' ...
- CSS中列表项list样式
CSS列表属性 属性 描述 list-style-属性 用于把所有用于列表的属性设置于一个声明中. list-style-image 将图象设置为列表项标志. list-style-position ...
- bzoj3336 Uva10572 Black and White
题目描述: 数据范围:2<=n,m<=8 题解: 很明显需要状压.但是怎么压不知道,压什么不知道. 然后从条件下手. 条件1要求黑色在一起白色在一起,记录轮廓线很容易做到. 条件2要求不能 ...
- turtle安装问题
原文来源:https://blog.csdn.net/liudongdong19/article/details/81283942 本人python版本为:Python 3.6.5 在安装turtle ...