[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 ←对有上下界费 ...
随机推荐
- linux分区满了,如何进行扩容
转自:https://blog.csdn.net/valage/article/details/73332147 图片中可以看到挂载点“/”的利用率移到100%,空间不够,所以要对其进行分区. 1. ...
- zabbix4.0LTS安装配置
一.环境准备 1.最小化安装centos7.5系统 2.安装常用软件包 yum install -y net-tools vim bash-completion 3.关闭selinux和修改主机名 v ...
- 详细介绍svn在eclipse中的使用(附图解说明)
SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subversion ...
- 微信小程序自定义 tabbar
一定的需求情况下,无法使用小程序原生的 tabbar 的时候,需要自行实现一个和 tabbar 功能一模一样的自制组件. 查阅了海量的博客和文档之后,亲自踩坑.总结了三种在不使用微信小程序原生 tab ...
- 2013第四届蓝桥杯C/C++ B组
题目标题: 高斯日记:Excel 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示 ...
- mysql 连接超时解决方案: 怎样修改默认超时时间
mysql数据库有一个wait_timeout的配置,默认值为28800(即8小时). 在默认配置不改变的情况下,如果连续8小时内都没有访问数据库的操作,再次访问mysql数据库的时候,mysql数据 ...
- PHP.ini 能不能加载子配置文件 ?
答案是不能,php这个地方用的是另一个方案解决的 编译的时候 用这个参数 --with-config-file-scan-dir指定一个目录 然后在这个目录里面加载ini https://www. ...
- sql语句(Mysql数据库)
Mysql数据库的sql语句: 一.基本操作 1.连接数据库 mysql -uroot -proot -hlocalhost -P3306 (-u表示用户名,-p密码,-h主机,-P端口号) 2.选择 ...
- python3 通过qq邮箱定时发送邮件
下面的代码为了每天定时发送监控邮件,监控什么呢?监控当天redis队列中是否有没有消费的数据,和当天mysql中新增的数据量 # -*- coding:utf-8 -*- from common.re ...
- [转] Unicode字符编码区间表
firebug 打UTF8 字符: var res = ""; for(var i=0x80;i< 0xff ;i++){ res += i.toString(16) + & ...