[BZOJ1927][Sdoi2010]星级竞速(费用流)

Vue3 - 超详细最新 wangEditor V5 富文本编辑器安装引入及使用教程,提供工具栏配置、基础富文本功能、API使用示例教程等(新手小白快速引入并植入到项目中) vue3,wangEditorv5富文本编辑器,wangEditorv5官方文档,vue3最新安装wangEditorv5富文本详细使用教程,vue3使用wangEditorv5编辑器示例代码,vue3网站网页安装植入富文本编辑器教程,vue3wangEditor使用api,vue3安装富文本控制台出现报错如何解决,vue3wangEditor-v5工具栏配置,vue3中使用富文本编译器wangEditor5的方法,wangeditor5在vue3中的全使用过程,vue3超详细最新wangedi 阅读详情

=== ===

这里放传送门

=== ===

题解

首先可以想到的是用最大流来模拟这个过程,然后在不同的行走方法上加上不同的费用来得到最小花费。那么就是先把每个点拆成两个,然后如果第i个点可以到达第j个点,就从第i个点的入点到第j个点的出点连一条费用为路径长度的边。那么关键就是如何处理那个跳跃的问题。

可以发现这样做的关键在于利用二分图的匹配,那么二分图匹配为什么能正确的解决这个问题呢?以下面这个图为例:
这里写图片描述
比如上面这个图跑出了两个匹配:a1-c2,c1-d2。这种匹配方案对应的实际情况应该是它先跳跃到a,然后从a跑到c再从c跑到d。也就是说这个时候从源点到a1的那条边记费用了,但从源点到c1的那条边没有记费用。出现这种情况的原因就是c对应的出点c2已经到达过了,也就是其实c这个点已经可以通过费用为0的路径到达了,当然不用再对它计算跳跃的费用了。而a对应的出点a2没有被访问过,也就是相当于直接跳跃到了a1,就要计算费用。

这说明如果从源点S跑到了一个点的入点,它算不算一次跳跃取决于这个点的出点有没有被访问过。那么如果一开始假设所有点都是通过跳跃到达的,那么只要访问了一个点的出点就相当于这个点不需要通过跳跃到达了,就要把相应的费用加回来。那么从S向所有点的入点连费用为0的边,从所有点的出点向T连费用为 −vali 的边,其中 vali 是跳跃到点i需要的费用。中间那些边就连费用为 wij 的边就可以了。

但是这样还是会有一个问题。费用流是在保证最大流的前提下求最小费用的,那有没有可能图中还存在一条从a到b的路径,但不走这条路径反而更优?其实是有可能的。解决这个问题的方法有两个,第一个是在SPFA增广的时候只要总费用为正数,也就是会增加花费,那么就退出,因为已经找不到费用更小的增广路了;第二个是从每个点的入点向T连一条费用为0的边,也就是如果这个点直接跳跃比任何一种通过航路到达的方法都要优,那么它会直接走这条0权边。下面的代码这两个方法都写进去了,但实测这两种措施加入任何一个都可以过。

实际上这个题还有一种正确性更加显然的方法。。就是直接从S到入点连费用为0的边,S到出点连费用为 vali 的边,出点到汇点连费用为0的边,然后中间的点之间连航行费用的边。建出图来长得很像。。应该是因为思路基本上是一样的吧。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 1000000000
#define inc(x)(x=(x==2000)?1:x+1)
using namespace std;
int n,m,a[810],tot,p[2010],dis[2010],pre[2010],S,T,sum,Cost,q[2010],head,tail;
bool ext[2010];
struct edge{
    int to,flw,cst,nxt;
}e[100010];
void add(int from,int to,int flow,int cost){
    e[tot].to=to;e[tot].flw=flow;e[tot].cst=cost;
    e[tot].nxt=p[from];p[from]=tot++;
}
int Increase(int S,int T){
    int Min=inf;
    for (int i=T;i!=S;i=e[pre[i]^1].to)
      Min=min(Min,e[pre[i]].flw);
    for (int i=T;i!=S;i=e[pre[i]^1].to){
        e[pre[i]].flw-=Min;
        e[pre[i]^1].flw+=Min;
    }
    return Min;
}
bool SPFA(int &Cost){
    int dlt;
    memset(dis,127,sizeof(dis));
    memset(ext,false,sizeof(ext));
    head=0;tail=1;q[tail]=S;
    dis[S]=0;ext[S]=true;
    while (head!=tail){
        int u;inc(head);
        u=q[head];ext[u]=false;
        for (int i=p[u];i!=-1;i=e[i].nxt){
            int v=e[i].to;
            if (e[i].flw>0&&dis[v]>dis[u]+e[i].cst){
                dis[v]=dis[u]+e[i].cst;pre[v]=i;
                if (ext[v]==false){
                    inc(tail);q[tail]=v;ext[v]=true;
                }
            }
        }
    }
    if (dis[T]>0) return false;//如果下面加入了0权边,这里判断改成inf也是对的
    dlt=Increase(S,T);
    Cost+=dlt*dis[T];
    return true;
}
int main()
{
    scanf("%d%d",&n,&m);
    memset(p,-1,sizeof(p));
    S=0;T=2*n+1;
    for (int i=1;i<=n;i++){
        scanf("%d",&a[i]);sum+=a[i];
        add(S,i,1,0);add(i,S,0,0);
        add(i,T,1,0);add(T,i,0,0);//这一句和上面dis<0的判断任意保留一个即可
        add(i+n,T,1,-a[i]);add(T,i+n,0,a[i]);
    }
    for (int i=1;i<=m;i++){
        int x,y,w;
        scanf("%d%d%d",&x,&y,&w);
        if (x<y){
            add(x,y+n,1,w);add(y+n,x,0,-w);
        }else{add(y,x+n,1,w);add(x+n,y,0,-w);}
    }
    while (SPFA(Cost));
    printf("%d\n",sum+Cost);
    return 0;
}

偏偏在最后出现的补充说明

用最大流来模拟问题是网络流问题的一个常见思路。
一定要对于常用模型的原理有正确的认识

【Java开发者必看】LangChain4j实战指南:使用AIService轻松集成聊天记忆Chat Memory到SpringBoot应用,通过封装多轮复杂对话,使聊天记忆的实现变得简单 聊天记忆是指在与用户的多轮对话过程中,能够记住之前的交互内容,从而提供更加连贯和个性化的回复。LangChain4j支持通过ChatMemoryProvider接口实现聊天记忆功能。 阅读详情

相关推荐

c语言串口编程详解

串口: 一种异步通信接口,通常用于低速数据传输。RS-232: 最常见的串口标准,定义了电气特性、连接器和信号线。UART: 通用异步收发传输器,是实现串口通信的硬件模块。通过以上内容,你应能够理解并实现C语言在Windows和Linux平台上的串口编程。希望这本手册能帮助你在实际项目中顺利进行串口通信开发。如果有任何疑问或需要进一步的帮助,请随时提问。

jkzyx123的博客 2224

bzoj1927: [Sdoi2010]星际竞速

跟上一题几乎一样。。。 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; #define rep(i,n) for(int i=1;i<=n;i...

weixin_30652491的博客 185

VMD-CNN-BiLSTM-Attention预测模型 —— 数学模型介绍&完整实例代码

想解决电力负荷预测中的非线性、非平稳难题?这篇博客介绍了一种创新混合模型,结合变分模态分解(VMD)和CNN-BiLSTM-Attention深度学习架构,实现超高精度预测! ✨ 核心亮点: ✅ VMD分解:有效分离复杂负荷信号,提取关键频率特征 ✅ 混合深度学习:CNN捕捉局部模式 + BiLSTM学习长时序依赖 + 注意力机制聚焦关键时段 ✅ 端到端优化:从数据预处理(滑动窗口、归一化)到模型训练(MSE损失+Adam优化),完整流程公开! ✅ 工业级评估:提供MSE、MAE、MAPE、R²多指标验证

qq_42924330的博客 1653

bzoj1927

题解: 费用流 拆点 代码: #include<bits/stdc++.h> const int N=40010; using namespace std; int n,m,l=1,fi[N],ne[N],to[N],v[N],c[N],cnt; int x,y,z,q[N*2],dis[N],fa[N],Ans,fl[N],flag[N]; ...

a5199519的博客 134

[Adaptive Autosar]深入理解--Time Synchronization

目录 1.TS典型应用场景 2.CP和AP时间同步对比 3.时间同步基础知识 4.TBR部分参数说明 5. TS功能说明 5.1 基本说明 5.2 时间纠正计算说明 5.3 时间验证 Time Synchronization 时间同步,后面简称TS 1.TS典型应用场景 时间同步,典型应用就是在自动驾驶领域,自动驾驶领域涉及到各个传感器的数据采集,如IMU采集当前车身姿态和运动信息,毫米波雷达-超声波雷达-环视摄像头-前视摄像头...等等传感器捕获的数据,在算法中需要精确知道每个数.

AgingMoon的博客 3997

有限差分法地震数据正演模拟(二)

正演模拟,是在地球物理勘探研究中,根据地质体的形状、产状和物性数据,通过构造数学模型计算得到其理论值(数学模拟),或通过构造实体模型来观测模型所产生的地球物理效应的数值(物理模拟)。p(t+1,x,z)即为下一时刻的波长信息,该波动方程的意义就是通过前一时刻(p(t-1,x,z))和现在时刻(p(t,x,z))预测下一时刻波的传播情况。声波波动方程:反应声波的传播规律,描述最简单的波现象的方程,p代表波场信息,v表示速度场信息因为速度只与速度场有关,所以只与x,z有关。其结果也可以作为反演的验证。

weixin_46285501的博客 3937

别再只会用平均值填坑了!Python实战:用Pandas和Scikit-learn搞定缺失值(附EM算法与多重插补代码)

本文详细介绍了Python中处理缺失值的多种方法,从基础的Pandas填充到高级的Scikit-learn插补技术,包括KNN近邻插补和迭代式多重插补。通过实战代码和效果评估,帮助数据科学家选择最适合的缺失值处理方案,提升数据清洗效率和质量。

weixin_30653023的博客 318

基于Simulink的压缩空气储能(Compressed Air Energy Storage, CAES)

压缩空气储能(CAES)是一种将电能转化为压缩空气存储在高压容器中,然后在需要时释放空气驱动涡轮机发电的技术。它具有大规模、长寿命和环境友好的特点,在电力系统中用于削峰填谷、频率调节和备用电源等应用。本项目将详细介绍如何在MATLAB/Simulink中搭建一个完整的基于压缩空气储能的系统,并提供具体的代码实现和设计步骤。如果你需要实现更复杂的控制逻辑,可以使用MATLAB Function模块。以下是一个简单的例子,展示了如何在该模块中实现一个条件逻辑:Matlab深色版本Kp = 1;

MHD0815的博客 1274

[BZOJ1927][SDOI2010][最小费用最大流]星际竞速

[Problem Description] 10 年一度的银河系赛车大赛又要开始了。作为全银河最盛大的活动之一, 夺得这个项目的冠军无疑是很多人的梦想,来自杰森座 α星的悠悠也是其中之一。 赛车大赛的赛场由 N 颗行星和M条双向星际航路构成,其中每颗行星都有 一个不同的引力值。大赛要求车手们从一颗与这 N 颗行星之间没有任何航路的 天体出发,访问这 N 颗行星每颗恰好一次,首先完成这一目标的人获

gaotianyu1350的专栏 984

osg点云加载与渲染

osg点云加载与渲染

cangqiongxiaoye的博客 821

SOME/IP协议详解「4.1·经典AutoSAR下的SOME/IP架构」

SOME/IP协议详解「4.1·经典AutoSAR下的SOME/IP架构」 点击返回雪云飞星的SOME/IP协议详解「总目录」 SOME/IP协议详解「4.1·经典AutoSAR下的SOME/IP架构」1 CP的SOME/IP架构概览2 业务报文通信流3 服务发现通信和控制流 1 CP的SOME/IP架构概览 2 业务报文通信流 3 服务发现通信和控制流 点击返回雪云飞星的SOME/IP协议详解「总目录」 ...

雪云飞星的博客 6067

bzoj1927[Sdoi2010]星际竞速

bzoj1927[Sdoi2010]星际竞速 题意: 赛车大赛的赛场由N颗行星和M条双向星际航路构成,其中每颗行星都有一个不同的引力值。大赛要求车手们从一颗与这N颗行星之间没有任何航路的天体出发,访问这N颗行星每颗恰好一次。赛车超能电驴在高速航行模式下,沿星际航路航行,但只能由每个星球飞往引力比它大的星球。在能力爆发模式下,超能电驴在经过一段时间的定位之后,能瞬间移动到任意一个行星。...

anheku1562的博客 146

【WRF工具】WRF 模型输出可视化工具 plotfmt

【WRF工具】WRF 模型输出可视化工具 plotfmt

WW、forever的博客 1292

【bzoj1927】【SDOI2010】【星际竞速】【bzoj1877】【SDOI2009】【晨跑】

1927: [Sdoi2010]星际竞速Time Limit: 20 Sec Memory Limit: 259 MB Submit: 1304 Solved: 777 [Submit][Status][Discuss] Description10 年一度的银河系赛车大赛又要开始了。作为全银河最盛大的活动之一, 夺得这个项目的冠军无疑是很多人的梦想,来自杰森座 α星的悠悠也是其中之一。 赛

Vampire 508

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【BZOJ 1927】 [Sdoi2010]星际竞速

费用流建模好题~

Regina8023 1192

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

bzoj 1927: [Sdoi2010]星际竞速

题目链接 bzoj 1927: [Sdoi2010]星际竞速 题解 可以考虑最小路径覆盖 转化成二分图之后进行最小费用最大流,把点拆违\(x,x^{'}\)对于连向的边连到\(x'\)上,对于连出点\(u\)只能经过u一次,流量为1,花费为cost[u->v],\(S->x,x'->T\) 也可进行无源汇上下界网络流 拆点限制最小流量下线为1,建一条流量为1的边,比上...

agtvo48266的专栏 144

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

[BZOJ1927]SDOI2010星际竞速|费用流

还是比较显然的费用流,不过一开始建图想错了。。把每个点i拆成i1,i2,若i到j有权值为q的边那就i1向j2连费用q流量1的边,源向每个i1连流量1费用0的边,向每个i2连流量1费用为瞬时移动到这个点的能量的费用的边,每个i2向汇连流量1,费用0的边,最小费用流就是答案。。可以用类似最小路径覆盖的思路去理解,连向汇的边是保证每个点都经过一次,源连向i2的边表示直接瞬移过去,i1连向j2的边表示从图

Tag_king的专栏 847

【bzoj1927】[Sdoi2010]星际竞速 费用流

Description10 年一度的银河系赛车大赛又要开始了。作为全银河最盛大的活动之一, 夺得这个项目的冠军无疑是很多人的梦想,来自杰森座 α星的悠悠也是其中之一。 赛车大赛的赛场由 N 颗行星和M条双向星际航路构成,其中每颗行星都有 一个不同的引力值。大赛要求车手们从一颗与这 N 颗行星之间没有任何航路的 天体出发,访问这 N 颗行星每颗恰好一次,首先完成这一目标的人获得胜利。 由于赛制非常开放

DQS的树洞 642

BZOJ1927 SDOI2010 星际竞速 费用流

题意:给定一张有向图,边均由编号较大的点连向编号较小的点,每个点都有一个权值a,表示可以从任意一个点转移到i点,花费a[i]的费用。求遍历每个点一次且仅一次的最小费用,起点终点任意,保证有解。 题解:拆点,费用流决定经过的点的顺序,由于瞬移到i的费用与之前经过的点无关,所以可以直接从S向每个点i连流量为1费用为a[i]的边。 #include <cstdio> ...

a18700013354的博客 165

【bzoj1927】【SDOI2010】【星际竞速】【费用流】

Description 10 年一度的银河系赛车大赛又要开始了。作为全银河最盛大的活动之一, 夺得这个项目的冠军无疑是很多人的梦想,来自杰森座 α星的悠悠也是其中之一。 赛车大赛的赛场由 N 颗行星和M条双向星际航路构成,其中每颗行星都有 一个不同的引力值。大赛要求车手们从一颗与这 N 颗行星之间没有任何航路的 天体出发,访问这 N 颗行星每颗恰好一次,首先完成这一目标的人获得胜利。 由于赛

sunshinezff的专栏 316

[bzoj1927][SDOI2010] 星际竞速 费用流

include include include define INF 0x7fffffff using namespace std; const int N = 2005; const int M = 4000005; int last[N],cnt=1,n,m; int q[N],d[N]; bool inq[N],mark[N]; struct Edge{

Unlimited Code Works 317

【费用流】BZOJ1927-[Sdoi2010]星际竞速

【题目大意】 有一些点,它们之间存在一些有向边(由编号小的到编号大的),从一点到另一点消耗时间为边长。也可以消耗Ti时间直接抵达任意一个点。问所有点都走一遍最少需要多少时间? 【思路】 ①将每个点i拆为i和i’。 ②由S向i连(cap=1,cost=0)的边。由i'向T连(1,0)的边,表示抵达过该点。 ③由S向i'连(1,Ti)的边,表示直接从某点跳转到i点。 ④根据有向边...

dianchunhui2654的博客 112

bzoj1927 [Sdoi2010]星际竞速

http://www.elijahqi.win/2018/01/10/bzoj1927-sdoi2010%e6%98%9f%e9%99%85%e7%ab%9e%e9%80%9f/ Description   10年一度的银河系赛车大赛又要开始了。作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的 梦想,来自杰森座α星的悠悠也是其中之一。赛车大赛的赛场由N颗行星和M条双向星际航路构成

Elijahqi 262

BZOJ1927: [Sdoi2010]星际竞速

BZOJ1927: [Sdoi2010]星际竞速 Description   10年一度的银河系赛车大赛又要开始了。作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的梦想,来自杰森座α星的悠悠也是其中之一。 赛车大赛的赛场由N颗行星和M条双向星际航路构成,其中每颗行星都有一个不同的引力值。 大赛要求车手们从一颗与这N颗行星之间没有任何航路的天体出发,访问这N颗行星每颗恰好一次...

weixin_30568715的博客 76
上一篇: [BZOJ2406]矩阵(二分+有上下界的网络流)
下一篇: [BZOJ1324]Exca王者之剑(最小割)
FromATP
博客等级 码龄10年 75粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值