P4553 80人环游世界

emm......先从上下界网络流(转)开始

再到现在的上下界费用流

因为有上下界,我们需要记下每个点的流量差$ex[i]$,用于调整

$ins(x,y,l,r,v)=link(x,y,r-l,v),ex[x]-=l,ex[y]+=l$

每个点都得经过$w$次,等价于:

把每个点$i$拆成$i_1,i_2$,$ins(i_1,i_2,w,w,0)$

题目限制总流量$=m$,于是设置一个附加点$T0$,$ins(T0,T,0,m,0)$,(最终一定会流满$m$)

对于其他点,也套路地连边:

$ins(S,i_1,0,m,0)$

$ins(i_2,T0,0,m,0)$

对于两点之间的边$(i,j,w)$:$ins(i_2,j_1,0,m,w)$

使源汇点流量守恒:$ins(T,S,0,m,0)$

蓝后就是对原图的调整(原图可能有些点不流量守恒):

按照上下界网络流的套路,新建调整源点汇点$pS,pT$

$if(ex[i]<0) link(i,pT,-ex[i],0);$
$if(ex[i]>0) link(pS,i,ex[i],0);$

最后直接以$pS,pT$为源点汇点跑费用流

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define N 2005
#define M 100005
int n,m,S,T0,T,pS,pT,ex[N],d[N],a[N],p[N],tC;
queue <int> h; bool inh[N];
int cnt=,hd[N],nxt[M],ed[N],poi[M],val[M],cst[M];
inline void adde(int x,int y,int v1,int v2){
nxt[ed[x]]=++cnt, hd[x]=hd[x]?hd[x]:cnt,
ed[x]=cnt, poi[cnt]=y, val[cnt]=v1,cst[cnt]=v2;
}
inline void link(int x,int y,int v1,int v2){adde(x,y,v1,v2),adde(y,x,,-v2);}
inline void ins(int x,int y,int l,int r,int v){link(x,y,r-l,v),ex[x]-=l,ex[y]+=l;}
bool bfs(){
memset(d,,sizeof(d)); int inf=d[];
h.push(S); d[S]=; a[S]=inf; inh[S]=;
while(!h.empty()){
int x=h.front(); h.pop(); inh[x]=;
for(int i=hd[x];i;i=nxt[i]){
int to=poi[i];
if(val[i]>&&d[to]>d[x]+cst[i]){
d[to]=d[x]+cst[i]; p[to]=i;
a[to]=min(a[x],val[i]);
if(!inh[to]) inh[to]=,h.push(to);
}
}
}if(d[T]==inf) return ;
tC+=a[T]*d[T];
for(int i=T;i!=S;i=poi[p[i]^])
val[p[i]]-=a[T],val[p[i]^]+=a[T];
return ;
}
int main(){
scanf("%d%d",&n,&m); int w;
S=*n+; T0=S+; T=T0+; pS=T+; pT=pS+;
ins(T0,T,,m,);
for(int i=;i<=n;++i){
ins(S,i,,m,);
ins(i+n,T0,,m,);
scanf("%d",&w);
ins(i,i+n,w,w,);
}
for(int i=;i<=n;++i)
for(int j=i+;j<=n;++j){
scanf("%d",&w);
if(w>-) ins(i+n,j,,m,w);
}
for(int i=;i<=T;++i){//调整
if(ex[i]<) link(i,pT,-ex[i],);
if(ex[i]>) link(pS,i,ex[i],);
}ins(T,S,,m,);
swap(S,pS);swap(T,pT);
while(bfs());
printf("%d",tC);
return ;
}

P4553 80人环游世界(上下界费用流)的更多相关文章

  1. 【BZOJ-2055】80人环游世界 上下界费用流 (无源无汇最小费用最大流)

    2055: 80人环游世界 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 321  Solved: 201[Submit][Status][Discus ...

  2. BZOJ 2055: 80人环游世界 [上下界费用流]

    2055: 80人环游世界 题意:n个点带权图,选出m条路径,每个点经过val[i]次,求最小花费 建图比较简单 s拆点限制流量m 一个点拆成两个,限制流量val[i],需要用上下界 图中有边的连边, ...

  3. bzoj 2055: 80人环游世界 -- 上下界网络流

    2055: 80人环游世界 Time Limit: 10 Sec  Memory Limit: 64 MB Description     想必大家都看过成龙大哥的<80天环游世界>,里面 ...

  4. P4553 80人环游世界

    题目地址:P4553 80人环游世界 上下界网络流 无源汇上下界可行流 给定 \(n\) 个点, \(m\) 条边的网络,求一个可行解,使得边 \((u,v)\) 的流量介于 \([B(u,v),C( ...

  5. 洛谷P4553 80人环游世界

    题目描述 https://www.luogu.org/problemnew/show/P4553 题解 思路比较显然,把图建出来,一个国家拆成两个点,中间设置上下界,然后跑费用流. 我把源那边的流量也 ...

  6. Luogu P4553 80人环游世界

    link 题目大意 自东向西有 \(n\) 个国家.有 \(m\) 个人,他们可以选择 \(n\) 个国家中任意一个开始,任意一个结束,但路线必须自东向西,且第 \(i\) 个国家必须恰好经过 \(v ...

  7. [BZOJ2055]80人环游世界 有上下界最小费用最大流

    2055: 80人环游世界 Time Limit: 10 Sec  Memory Limit: 64 MB Description     想必大家都看过成龙大哥的<80天环游世界>,里面 ...

  8. 【BZOJ2055】80人环游世界 有上下界费用流

    [BZOJ2055]80人环游世界 Description     想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么     一个 ...

  9. BZOJ2055 80人环游世界 网络流 费用流 有源汇有上下界的费用流

    https://darkbzoj.cf/problem/2055 https://blog.csdn.net/Clove_unique/article/details/54864211 ←对有上下界费 ...

随机推荐

  1. 认知redis

    一.redis是什么? 1.基于key-value的内存No sql 数据库(非关系型数据库) 2.读写性能非常好 二.redisd的数据类型有哪些?特点分别是什么? 1)string 一个键对一个值 ...

  2. PHP实现session共享

    通过修改PHP-FPM配置文件,实现session会话共享: - 配置PHP使用memcached服务器共享Session信息 - 客户端访问两台不同的后端Web服务器时,Session 信息一致 环 ...

  3. 【改】linux中分区的概念

    1.目录和分区 区别:Linux的分区是物理上的概念,从物理上将存储空间分开:Linux的目录是逻辑上的概念,Linux的目录树实际上是一个分区之间的数据逻辑结构关系,不是物理结构: 联系:一个分区必 ...

  4. Hugin

    Hugin简介 Hugin是一个开源的拼接软件,包含大量的拼接所需模块源码以及使用了部分Panorama Tools中的工具. 1)libpano13(Panorama Tools). 2)cpfin ...

  5. ltp-ddt eth_switch_config学习

    # @name ALE Table test using SWITCH-CONFIG # @desc Checks default entries in ALE table and verifies ...

  6. CMD批处理查看当前路径

    1.直接在CMD窗口查看 echo %cd% 2.建立批处理文件 @echo offecho 当前盘符:%~d0echo 当前盘符和路径:%~dp0echo 当前批处理全路径:%~f0echo 当前盘 ...

  7. dede织梦5.7上传图片302以及Error #2038问题解决

    dede织梦5.7上传图片302以及Error #2038问题解决 三月 19, 2012 · Posted in DEDE二次开发, PHP  Number of View: 1388 在后台图片集 ...

  8. char* 和 cha[]

    char* s1 = "hello";//字符串常量 s是一个保存了字符串首地址的指针变量,同时也是字符串的名字,s的内容是第一个字符的地址,当s指向常量字符串时候,内容不能改变( ...

  9. 和风api爬取天气预报数据

    ''' 和风api爬取天气预报数据 目标:https://free-api.heweather.net/s6/weather/forecast?key=cc33b9a52d6e48de85247779 ...

  10. cookie字段属性解析

    一个域名下面可能存在着很多个cookie对象.如果我们用selenium的get_cookies方法,可以得到当前浏览器的多个cookie,比如: {'name': 'QCARJSESSIONID', ...