[BZOJ2055]80人环游世界 有上下界最小费用最大流
2055: 80人环游世界
Time Limit: 10 Sec Memory Limit: 64 MB
Description
Input
Output
在第一行输出最少的总费用。
Sample Input
2 1 3 1 2 1
2 6 8 5 0
8 2 4 1
6 1 0
4 -1
4
Sample Output
HINT
1<= N < =100 1<= M <= 79
题解:
做完上下界可行流和最大最小流还不算完,我们还可以搞上下界费用流。。。。。
我们考虑这道题的建模:
由于一共有m个人,所以我们额外建一个节点S‘,连一条S->S',上下界为[m,m],费用为0的弧,这样我们就限制了人数
对于每个国家"有且仅有"的限制,我们把国家拆点为入点i和出点i',对于国家i连一条i->i',上下界为[vi,vi],费用为0的弧,这样就可以限制通过这个国家的人数
当然,由于可以在任意一个地方开始旅行,所以我们还要对于每个国家i连一条S'->i,上下界为[0,inf],费用为0的弧
同理,由于可以在任意一个地方结束旅行,所以我们还要对于每个国家i连一条i'->T,上下界为[0,inf],费用为0的弧
而对于国家i,j间的机票钱,我们需要连一条i'->j,上下界为[0,inf],费用为val[i][j]的弧
在这样构图之后,我们考虑如何处理上下界:
依旧定义totflow数组表示某个点的入流量-出流量,那么我们给totflow[i]>0的点连i->tt的边,给totflow[i]<0的点连ss->i的边
然后我们考虑,最终的总费用应该是附加流的最小费用最大流+初始流的残量网络中每条边的剩余流量*边权
由于每条边不是费用为0,就是上下界残量(上界-下界)为0,所以残量网络带来的费用为0
所以我们只要计算附加流的最小费用最大流输出即可啦!
代码实现:
#include <cstdio>
#include <cstring>
using namespace std;
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}
const int N=,M=,inf=0x7fffffff;
struct edge{int zhong,next,val,flow;}s[M];
int n,m,e=,adj[N],totflow[N];
int S,T,ss,tt,Station;
int hd,tl,q[M],ans,dis[N],pre[N];
inline void add(int qi,int zhong,int flow,int val)
{
s[++e].zhong=zhong,s[e].next=adj[qi],adj[qi]=e,
s[e].flow=flow,s[e].val=val;
}
inline void Add(int a,int b,int c,int d)
{add(a,b,c,d),add(b,a,,-d);}
bool vis[N];
inline int Shoot()
{
int x=tt,f=inf;
while(x!=ss)
f=min(f,s[pre[x]].flow),
x=s[pre[x]^].zhong;
x=tt;
while(x!=ss)
s[pre[x]].flow-=f,s[pre[x]^].flow+=f,
x=s[pre[x]^].zhong;
return f;
}
inline bool spfa()
{
memset(dis,0x7f,sizeof(dis));
memset(vis,,sizeof(vis));
dis[ss]=,vis[ss]=,q[hd=tl=]=ss;
register int i,j,x,u;
while(hd<=tl)
for(x=q[hd++],vis[x]=,i=adj[x];i;i=s[i].next)
if(s[i].flow&&dis[(u=s[i].zhong)]>dis[x]+s[i].val)
{
pre[u]=i,dis[u]=dis[x]+s[i].val;
if(!vis[u])q[++tl]=u,vis[u]=;
}
if(dis[tt]==dis[])return ;
ans+=dis[tt]*Shoot();
return ;
}
int main()
{
register int i,j,k,val,lim;
scanf("%d%d",&n,&m);
Station=*n+,S=Station+,T=S+,ss=T+,tt=ss+;
totflow[S]-=m,totflow[Station]+=m;
for(i=;i<=n;++i)
{
scanf("%d",&lim);
totflow[i]-=lim,totflow[n+i]+=lim;
Add(Station,i,inf,),Add(n+i,T,inf,);
}
for(i=;i<n;++i)
for(j=i+;j<=n;++j)
{
scanf("%d",&val);
if(val!=-)Add(i+n,j,inf,val);
}
for(i=;i<=T;++i)
{
if(totflow[i]>)Add(ss,i,totflow[i],);
if(totflow[i]<)Add(i,tt,-totflow[i],);
}
Add(T,S,inf,);
while(spfa());
printf("%d\n",ans);
}
[BZOJ2055]80人环游世界 有上下界最小费用最大流的更多相关文章
- BZOJ 2055 80人环游世界 有上下界最小费用可行流
		题意: 现在有这么一个m人的团伙,也想来一次环游世界. 他们打算兵分多路,游遍每一个国家. 因为他们主要分布在东方,所以他们只朝西方进军.设从东方到西方的每一个国家的编号依次为1...N.假若第 ... 
- BZOJ 2055: 80人环游世界(有上下界的费用流)
		题面 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 693 Solved: 434 [Submit][Status][Discuss] Descript ... 
- 【BZOJ2055】80人环游世界 有上下界费用流
		[BZOJ2055]80人环游世界 Description 想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么 一个 ... 
- P4553 80人环游世界(上下界费用流)
		P4553 80人环游世界 emm......先从上下界网络流(转)开始 再到现在的上下界费用流 因为有上下界,我们需要记下每个点的流量差$ex[i]$,用于调整 $ins(x,y,l,r,v)=li ... 
- BZOJ 3876 支线剧情  有源汇有上下界最小费用可行流
		题意: 给定一张拓扑图,每条边有边权,每次只能从第一个点出发沿着拓扑图走一条路径,求遍历所有边所需要的最小边权和 分析: 这道题乍一看,可能会想到什么最小链覆盖之类的,但是仔细一想,会发现不行,一是因 ... 
- BZOJ2055: 80人环游世界
		题解: 总算A掉了,各种蛋疼... int main() { freopen("input.txt","r",stdin); freopen("out ... 
- 【上下界网络流  费用流】bzoj2055: 80人环游世界
		EK费用流居然写错了…… Description 想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么 一个80人的团 ... 
- bzoj千题计划159:bzoj2055: 80人环游世界(有源汇上下界可行最小费用流)
		http://www.lydsy.com/JudgeOnline/problem.php?id=2055 某个国家必须经过vi次, 可以转化为上下界都为vi的边 对这张图做有源汇上下界可行最小费用流 ... 
- BZOJ2055 80人环游世界 网络流 费用流 有源汇有上下界的费用流
		https://darkbzoj.cf/problem/2055 https://blog.csdn.net/Clove_unique/article/details/54864211 ←对有上下界费 ... 
随机推荐
- android 判断应用是否在前台显示
			在一些场景下我们需要知道应用是否在前台显示,当不在前台显示的时候,一些后台进程可以暂时停止,比如一些查询任务.不必要的线程.不需要的渲染等,以减少对设备资源的占用.判断应用是否在前台通常可以使用一下方 ... 
- eclipse生成ant build.xml打war包
			背景: 最近想实现jenkins+ant命令一键打war包,部署到测试环境,然后自动化接口测试,结果发现用eclipse本身导出的ant buildfiles文件,打包出来都是空文件.很多代码都没 ... 
- cpp-variable-lifetime
			#include <cstdio> #include <iostream> using namespace std; class TmpClass; void FuncScop ... 
- RSA详解
			RSA RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作.RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥 ... 
- Datawhale MySQL 训练营  Task1:MySQL 安装与数据库基础
			安装 平台 Windows X64; MySQL: 直接去 MySQL 官网 下载:点击即可安装:安装过程中可能会要求 python3.7; 可以去安装一个 python3.7; 可视化工具:Navi ... 
- gitlab+jenkins持续集成(二)
			1.jenkins服务器上的配置 -bin.tar.gz -C /opt/ yum install -y git /conf/settings.xml #只需更改maven的地址 <?xml v ... 
- 分享一篇IBN(Intent-based networking)调研报告
			IBN调研报告 背景 SDN(Software-defined network):最大特点在于具有松耦合的控制平面与数据平面.支持集中化的网络状态控制.实现底层网络设施对上层应用的透明.具有灵活的软件 ... 
- Java 内存模型_1
			title: Java 内存模型_1 date: 2017-01-15 17:11:02 tags: [JMM] categories: [Programming,Java] --- 概述 本文记录 ... 
- Python序列之列表  (list)
			作者博文地址:http://www.cnblogs.com/spiritman/ 列表是Python中最基本的数据结构,是Python最常用的数据类型.Python列表是任意对象的有序集合,通过索引访 ... 
- fetch上传文件
			通过简单的配置,实现form表单文件上传 var formData = new FormData(); var fileField = document.querySelector("inp ... 
