bzoj 1834[ZJOI2010]network 网络扩容

2024-01-30 05:38

本文主要是介绍bzoj 1834[ZJOI2010]network 网络扩容,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

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

Input

第一行包含三个整数N,M,K,表示有向图的点数、边数以及所需要增加的流量。
接下来的M行每行包含四个整数u,v,C,W,表示一条从u到v,容量为C,扩容费用为W的边。
N<=1000,M<=5000,K<=10

Output

输出文件一行包含两个整数,分别表示问题1和问题2的答案。

Sample Input

5 8 2
1 2 5 8
2 5 9 9
5 1 6 2
5 1 1 8
1 2 8 7
2 5 4 9
1 2 1 1
1 4 2 1

Sample Output

13 19

Solution

第一问显然可以用最大流直接解决
第二问,因为k不大于10,于是,跑k遍费用流,可以非常暴力的对每条流量为0的边加1流量,如果是第一次加,加入费用,如果是第二次加,给反向边加上负的费用。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;#define N 1010
#define M 5050
#define INF 0x7ffffffstruct edge 
{int x,d,y,w,c,next;
};edge side[M*2];
int last[N],dis[N],t[N],pre[N];
int n,m,k,l=1,s,e;void add(int x,int y,int w,int c)
{l++;side[l].x=x;side[l].y=y;side[l].w=w;side[l].c=c;side[l].d=0;side[l].next=last[x];last[x]=l;
}void init()
{scanf("%d%d%d",&n,&m,&k);int x,y,c,w;for (int i=1;i<=m;i++){scanf("%d%d%d%d",&x,&y,&w,&c);add(x,y,w,c);add(y,x,0,-c);}
}queue<int> Q;bool bfs()
{memset(dis,0,sizeof(dis));dis[1]=1;Q.push(1);while (!Q.empty()){int now=Q.front(); Q.pop();for (int i=last[now];i!=0;i=side[i].next){int j=side[i].y;if (side[i].w==0 || dis[j]!=0) continue;dis[j]=dis[now]+1;Q.push(j);}}if (dis[n]==0) return false;else return true;
}int dfs(int x,int maxf)
{if (x==n || maxf==0) return maxf;int ret=0;for (int i=last[x];i!=0;i=side[i].next){int j=side[i].y;if (side[i].w==0 || dis[x]+1!=dis[j]) continue;int f=dfs(j,min(maxf-ret,side[i].w));side[i].w-=f;side[i^1].w+=f; ret+=f;if (ret==maxf) break;}return ret;
}void dinic()
{int ans=0;while (bfs()) ans+=dfs(1,INF);printf("%d ",ans);
}void spfa()
{for (int i=1;i<=n;i++)dis[i]=INF;memset(t,0,sizeof(t));memset(pre,0,sizeof(pre));Q.push(1);dis[1]=0; t[1]=1;while (!Q.empty()){int now=Q.front(); Q.pop();for (int i=last[now];i!=0;i=side[i].next){if (side[i].w<=0) continue;int j=side[i].y;if (dis[j]>dis[now]+side[i].d){dis[j]=dis[now]+side[i].d;pre[j]=i;if (t[j]==0){Q.push(j);t[j]=1;}}}if (now!=1) t[now]=0;}//printf("%d\n",dis[n]);
}int find()
{spfa();int s=0;for (int i=pre[n];;i=pre[side[i].x]){side[i].w-=1;side[i^1].w+=1;if (side[i].w==0){side[i].w=1;if (side[i].d==side[i].c) side[i^1].d=side[i^1].c;side[i].d=side[i].c;}if (side[i].x==1) break;}return dis[n];
}int main()
{init();dinic();for (int i=2;i<=l;i+=2)if (side[i].w==0){side[i].w=1;side[i].d=side[i].c;}int ans=0;for (int i=1;i<=k;i++)ans+=find();printf("%d\n",ans);return 0;
}

这篇关于bzoj 1834[ZJOI2010]network 网络扩容的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/659252

相关文章

Linux给磁盘扩容(LVM方式)的方法实现

《Linux给磁盘扩容(LVM方式)的方法实现》本文主要介绍了Linux给磁盘扩容(LVM方式)的方法实现,涵盖PV/VG/LV概念及操作步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录1 概念2 实战2.1 相关基础命令2.2 开始给LVM扩容2.3 总结最近测试性能,在本地打数据时,发现磁盘空

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

golang中slice扩容的具体实现

《golang中slice扩容的具体实现》Go语言中的切片扩容机制是Go运行时的一个关键部分,它确保切片在动态增加元素时能够高效地管理内存,本文主要介绍了golang中slice扩容的具体实现,感兴趣... 目录1. 切片扩容的触发append 函数的实现2. runtime.growslice 函数gro

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用