P4553 80人环游世界(上下界费用流)

本文深入探讨了上下界费用流算法的实现细节,通过具体的代码示例解释了如何处理网络流中的流量守恒问题,介绍了如何构建和调整图结构以满足算法需求,适用于解决复杂的流量分配问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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=1,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,0,-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,127,sizeof(d)); int inf=d[0];
    h.push(S); d[S]=0; a[S]=inf; inh[S]=1;
    while(!h.empty()){
        int x=h.front(); h.pop(); inh[x]=0;
        for(int i=hd[x];i;i=nxt[i]){
            int to=poi[i];
            if(val[i]>0&&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]=1,h.push(to);
            }
        }
    }if(d[T]==inf) return 0;
    tC+=a[T]*d[T];
    for(int i=T;i!=S;i=poi[p[i]^1])
        val[p[i]]-=a[T],val[p[i]^1]+=a[T];
    return 1;
}
int main(){
    scanf("%d%d",&n,&m); int w;
    S=2*n+1; T0=S+1; T=T0+1; pS=T+1; pT=pS+1;
    ins(T0,T,0,m,0);
    for(int i=1;i<=n;++i){
        ins(S,i,0,m,0);
        ins(i+n,T0,0,m,0);
        scanf("%d",&w);
        ins(i,i+n,w,w,0);
    }
    for(int i=1;i<=n;++i)
        for(int j=i+1;j<=n;++j){
            scanf("%d",&w);
            if(w>-1) ins(i+n,j,0,m,w);
        }
    for(int i=1;i<=T;++i){//调整
        if(ex[i]<0) link(i,pT,-ex[i],0);
        if(ex[i]>0) link(pS,i,ex[i],0);
    }ins(T,S,0,m,0);
    swap(S,pS);swap(T,pT);
    while(bfs());
    printf("%d",tC);
    return 0;
}

 

 

转载于:https://www.cnblogs.com/kafuuchino/p/10803659.html

### 关于 UniApp 框架的推荐资源与教程 #### 1. **Uniapp 官方文档** 官方文档是最权威的学习资料之一,涵盖了从基础概念到高级特性的全方位讲解。对于初学者来说,这是了解 UniApp 架构和技术细节的最佳起点[^3]。 #### 2. **《Uniapp 从入门到精通:案例分析与最佳实践》** 该文章提供了系统的知识体系,帮助开发者掌握 Uniapp 的基础知识、实际应用以及开发过程中的最佳实践方法。它不仅适合新手快速上手,也能够为有经验的开发者提供深入的技术指导[^1]。 #### 3. **ThorUI-uniapp 开源项目教程** 这是一个专注于 UI 组件库设计和实现的教学材料,基于 ThorUI 提供了一系列实用的功能模块。通过学习此开源项目的具体实现方式,可以更好地理解如何高效构建美观且一致的应用界面[^2]。 #### 4. **跨平台开发利器:UniApp 全面解析与实践指南** 这篇文章按照章节形式详细阐述了 UniApp 的各个方面,包括但不限于其工作原理、技术栈介绍、开发环境配置等内容,并附带丰富的实例演示来辅助说明理论知识点。 以下是几个重要的主题摘选: - **核心特性解析**:解释了跨端运行机制、底层架构组成及其主要功能特点。 - **开发实践指南**:给出了具体的页面编写样例代码,展示了不同设备间 API 调用的方法论。 - **性能优化建议**:针对启动时间缩短、图形绘制效率提升等方面提出了可行策略。 ```javascript // 示例代码片段展示条件编译语法 export default { methods: { showPlatform() { console.log(process.env.UNI_PLATFORM); // 输出当前平台名称 #ifdef APP-PLUS console.log('Running on App'); #endif #ifdef H5 console.log('Running on Web'); #endif } } } ``` #### 5. **其他补充资源** 除了上述提到的内容外,还有许多在线课程视频可供选择,比如 Bilibili 上的一些免费系列讲座;另外 GitHub 和 GitCode 平台上也有不少优质的社区贡献作品值得借鉴研究。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值