[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 ←对有上下界费 ...
随机推荐
- 禁用AxWebBrowser右键菜单
出处:http://stackoverflow.com/questions/41781647/disabling-the-axwebbrowser-context-menu-vb-net 通过底层消息 ...
- Linux(centos7)之更换安装python3(二)
Linux不比window好安装python,折腾了好久,终于成功安装上了python,window上一个安装包完事,可惜Linux上python版本太低不好使,还要更换为3版本,百度了好久,教程上总 ...
- svn图文教程-宋正河整理
下载地址:http://download.csdn.net/download/songzhengdong82/4433476 在线浏览:http://wenku.baidu.com/view/07f1 ...
- Educational Codeforces Round 61 (Rated for Div. 2) E. Knapsack
非常经典的dp题,因为1至8的最大公约数是840,任何一个数的和中840的倍数都是可以放在一起算的, 所以我只需要统计840*8的值(每个数字(1-8)的sum%840的总和),剩下都是840的倍数 ...
- 基于Ubuntu+kodexplorer可道云的私有云网盘
1.可用的服务器:组装PC机一台,操作系统为Ubuntu 14.04 LTS,无桌面环境,放在机房,使用远程终端进行访问.有安装了Apache2,运行着svn服务.内网IP地址为192.168.0.1 ...
- RAID中条带的概念
raid把数据分成条带,一个条带横跨所有数据磁盘,每个磁盘上存储条带的一部分,称为sagment,也称为条带深度.一个条带包含的扇区或块的个数,称为条带长度. raid向操作系统提供的是卷,是连续的扇 ...
- lastlog命令详解
基础命令学习目录首页 原文链接:https://www.cnblogs.com/qiyebao/p/4331078.html last 显示所有用户最后登录信息(会显示系统用户) last -u 50 ...
- 前端_JavaScript
目录 JavaScript的基础 引入方式 JS的变量.常量和标识符 JS的数据类型 运算符 流程控制 JavaScript的对象 String对象 Array对象 Date对象 Math对象 Fun ...
- IOS上z-index和fixed定位无效
IOS上z-index和fixed定位无效 在该元素上加: -webkit-transform:translateZ(1px); -moz-transform:translateZ(1px); -o- ...
- “秒杀”问题的数据库和SQL设计【转载】
“秒杀”问题的数据库和SQL设计 APRIL 21ST, 2015 问题的来源 完全不考虑一致性的方案 表结构 方案 存在的问题 保证单用户不会重复购买 解决超卖问题 方案 优化 提高性能了 鱼与熊掌 ...