好久没写题解了啊···

题目大意:

给你一幅n个点的网络,先求出其1到n的最大流,每条弧还会有个属性\(cost_i\),表示没扩容一个单位的费用,现在我们要求的就是扩容K个单位的最小费用

思路:

这是一道比较裸的网络流,第一问直接dinic就是了,重点就在于第二问。我们把第一问的残量网络继续利用,其中的每条弧的费用都是0,此时我们再在第\(i\)条弧的两端之间在建一条弧,弧的容量是\(INF\),费用就是\(cost_i\)。这样我们固然可以保证费用正确,可是我们保证不了扩容了K,我们就可以建一个超级源点,连向1号点,容量为K,费用为0。在这个网络中最大流一定是满流,也就是K啊,此时的最小费用就是我们所要求的。

具体实现:

这就很简单了,一遍\(dinic\),再一遍\(MCMF\)我们就可以了

代码如下

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue> using namespace std; const int maxn=10001,maxm=50001,inf=0x7f7f7f7f;
int n,m,k,tot,next[maxm<<1],beg[maxm<<1],head[maxn],flow[maxm<<1],fflow[maxm<<1],last[maxn],pre[maxn],fl[maxn],nxt[maxm<<1],to[maxm<<1],ccost[maxm<<1],cost[maxm<<1],d[maxn],dep[maxn];
bool vis[maxn]; void addedge(int x,int y,int z,int co,int type){
nxt[++tot]=head[x];
head[x]=tot;
to[tot]=y;
beg[tot]=x;
flow[tot]=z;
fflow[tot]=type?z:0;
cost[tot]=type?co:0;
ccost[tot]=co;
} bool bfs(){
memset(dep,0,sizeof(dep));
queue<int> q;
q.push(1);
dep[1]=1;
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=head[x];i;i=nxt[i]){
int u=flow[i],v=to[i];
if(u>0 and !dep[v]){
dep[v]=dep[x]+1;
q.push(v);
}
}
}
return dep[n];
} int dfs(int x,int mini){
if(x==n)return mini;
for(int i=head[x];i;i=nxt[i]){
int u=flow[i],v=to[i];
if(u>0 and dep[v]==dep[x]+1){
int dd=dfs(v,min(mini,u));
if(dd>0){
flow[i]-=dd;
flow[i^1]+=dd;
return dd;
}
}
}
return 0;
} int dinic(){
int ret=0;
while(bfs()){
int tmp=dfs(1,inf);
while(tmp){
ret+=tmp;
tmp=dfs(1,inf);
}
}
return ret;
} bool spfa() {
memset(d,0x7f,sizeof(d));
memset(fl,0x7f,sizeof(fl));
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(n+1);
vis[n+1]=1;
d[n+1]=0;
pre[n]=-1;
while(!q.empty()) {
int now=q.front();
q.pop();
for(int i=head[now];i;i=nxt[i]){
int v=to[i];
if(fflow[i]>0 and d[v]>d[now]+cost[i]){
d[v]=d[now]+cost[i];
pre[v]=now;
last[v]=i;
fl[v]=min(fl[now],fflow[i]);
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
vis[now]=0;
}
return pre[n]!=-1;
} int mcmf(){
int ret=0;
while (spfa()){
int now=n;ret+=fl[n]*d[n];
while (now!=n+1){
fflow[last[now]]-=fl[n];
fflow[last[now]^1]+=fl[n];
now=pre[now];
}
}
return ret;
} void rebuild(){
int cnt=tot;
for(int i=2;i<=cnt;i+=2){
fflow[i]=flow[i];
fflow[i+1]=flow[i+1];
addedge(beg[i],to[i],inf,ccost[i],1);
addedge(to[i],beg[i],0,-ccost[i],1);
}
} int main(){
scanf("%d%d%d",&n,&m,&k);
addedge(n+1,1,k,0,1);
for(int i=1;i<=m;i++){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
addedge(a,b,c,d,0);
addedge(b,a,0,-d,0);
}
int ans1=dinic();
rebuild();
int ans2=mcmf();
printf("%d %d\n",ans1,ans2);
return 0;
}

bzoj1834 网络扩容 网络流的更多相关文章

  1. BZOJ-1834 网络扩容 最小费用最大流+最大流+乱搞

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

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

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

  3. bzoj1834 网络扩容

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

  4. 洛谷$P2604\ [ZJOI2010]$网络扩容 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 昂第一问跑个最大流就成不说$QwQ$ 然后第二问,首先原来剩下的边就成了费用为0的边?然后原来的所有边连接的两点都给加上流量为$inf$费用为$w$的边,保 ...

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

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

  6. 【BZOJ1834】[ZJOI2010]network 网络扩容 最大流+最小费用流

    [BZOJ1834][ZJOI2010]network 网络扩容 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不 ...

  7. 【bzoj1834】[ZJOI2010]network 网络扩容

    1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2701  Solved: 1368[Submit ...

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

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

  9. bzoj1834: [ZJOI2010]network 网络扩容

    努力看了很久样例一直过不了...然后各种输出中间过程啊巴拉巴拉弄了1h,没办法了...然后突然想到啊原来的边可以用啊为什么不用...于是A了...感人肺腑 #include<cstdio> ...

随机推荐

  1. 转-AFNetwork 作用和用法详解

    来自:http://www.maxiaoguo.com/clothes/269.html AFNetworking是一个轻量级的iOS网络通信类库.它建立在NSURLConnection和NSOper ...

  2. android开发学习——Error:Error converting bytecode to dex: Cause: com.android.dex.DexException: Multiple dex files define Lcom/google/zxing/BarcodeFormat;

    在Android Studio中,sync project没有错,但是run时会报错; http://blog.csdn.net/q568430333/article/details/50969033 ...

  3. String的用法——转换功能

    package cn.itcast_05; /* String类的转换功能: byte[] getByte():把字符串转换成字节数组 复习: public String(byte[] bytes): ...

  4. Selenium--Python环境部署

    本文引读:一二为python环境安装:三为selenium安装同时介绍了pip:四为PyCharm安装:五为验证SE可以正常使用 一.下载python安装包 我这里安装的是python3.6.5,官网 ...

  5. windows server 2008 r2 IIS7下网站配置 只允许指定的IP地址访问

    步骤一.找到ip地址和域限制 步骤二.添加全部拒绝 步骤三.添加允许访问的ip地址(局域网填写局域网ip,公网填写公网ip)  步骤四:如果想要拒绝某些ip访问,直接在规则中添加拒绝条目就可以  

  6. [Android]如何实现无限滚动的ListViw/GridView(翻译)

    ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们提供了一个良好,整洁的用户体验 ...

  7. Websocket 关闭浏览器报错

    这个报错,是因为你关闭之后,websocket 自动连接失败造成的 只要在你的websocket 运行的类里面加上: @OnError public void onError(Throwable e, ...

  8. Vuex/Vue 练手项目 在线汇率转换器

    详情请点击: https://zhuanlan.zhihu.com/p/33362758

  9. Linux关于文件的权限笔记

    1.调整文件的权限命令:chmodLinux的每个文件都定义了文件的拥有者:u(user).拥有组:g(group).其他人:o(others)权限,对应的权限用rwx的组合来定义.使用chmod命令 ...

  10. crontab 每月最后一天执行命令

    没有什么是解决不了的事情,如果有,只是我们的知识不够精通,学得不扎实 需求:有一个程序,需要在每个月的最后一天执行 例如:每个月的最后一天早上8:00 打印 dede 到  /tmp/test.txt ...