[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管道详解
原文链接:http://blog.csdn.net/qq_38646470/article/details/79564392 符号表示 | 和管道特别形象. 作用: 管道是Linux中很重要的 ...
- (2017)你最不建议使用的Python Web框架?
https://www.sohu.com/a/164042813_737973 挺有意思的 经过一周的Django学习,以及对比,最终选定了以Flask入手来学习Python web开发.
- Unity 自定义编辑器窗口 画线
最近在学习状态机, 想自己实现一个可视化编辑器, 需要将多个状态之间用线条连接起来, 效果如下: 代码如下: Material m;Vector2 start;Vector2 end;Color co ...
- MergeSort 归并排序(java)
MergeSort 归并排序 排序思想:1,分解待排序的n个元素为两个子列,各为n/2个元素 2,若子列没有排好序,重复1步骤,每个子列继续分解为两个子列,直至被分解的子列个数为1 3,子列元素个数为 ...
- 三种UIScrollView嵌套实现方案
背景 随着产品功能不断的迭代,总会有需求希望在保证不影响其他区域功能的前提下,在某一区域实现根据选择器切换不同的内容显示. 苹果并不推荐嵌套滚动视图,如果直接添加的话,就会出现下图这种情况,手势的冲突 ...
- CHAPTER 40 Science in Our Digital Age 第40章 我们数字时代的科学
CHAPTER 40 Science in Our Digital Age 第40章 我们数字时代的科学 The next time you switch on your computer, you ...
- 从零开始的Python学习Episode 17——序列化
序列化 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语 言中也被称之为serialization,marshalling,flattenin ...
- 2、Ansible在使用过程中出现的错误解决方法
1.安装完成后允许命令出错 Traceback (most recent call last): File "/usr/bin/ansible", line 197, in (ru ...
- Android NDK 工具链的使用方法(Standalone Toolchain)
转载:http://blog.csdn.net/smfwuxiao/article/details/6587709 首先需要确定目标机器的指令集. 如果是 x86 的机器,用 x86-4.4.3 版本 ...
- 10分钟入门git简易教程
在注册了github账号之后,一度不知道该如何使用. 在仔细研究了github的官方说明文档.廖老师的教程.还有许多博主的文章之后,总算对github的操作和体系有了较为深刻的了解,还有这篇简单的入门 ...