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

相关文章

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Python实现简单封装网络请求的示例详解

《Python实现简单封装网络请求的示例详解》这篇文章主要为大家详细介绍了Python实现简单封装网络请求的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装依赖核心功能说明1. 类与方法概览2.NetHelper类初始化参数3.ApiResponse类属性与方法使用实

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

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