Bicycles(变形dijkstra,动态规划思想)

Codeforces Round 918 (Div. 4)

G. Bicycles


G. Bicycles

题意:

斯拉夫的所有朋友都打算骑自行车从他们住的地方去参加一个聚会。除了斯拉维奇,他们都有一辆自行车。他们可以经过 n n n 个城市。他们都住在城市 1 1 1 ,想去参加位于城市 n n n 的聚会。城市地图可以看作一个无向图,有 n n n 个节点和 m m m 条边。边 i i i 连接城市 u i u_i ui v i v_i vi ,长度为 w i w_i wi

斯拉夫没有自行车,但他有的是钱。每个城市都有一辆自行车出售。在 i i i 这个城市中,自行车的速度系数为 s i s_{i} si 。一旦斯拉维奇买了一辆自行车,他就可以在任何时候用它从他现在所在的城市前往任何邻近的城市,只需花费 w i ⋅ s j w_i \cdot s_j wisj 时间,因为他是在用自己拥有的自行车 j j j 穿越边缘 i i i

斯拉维奇想买多少辆自行车都可以,因为钱对他来说不是问题。由于斯拉维奇不喜欢骑自行车旅行,他希望在最短的时间内从他的住处到达聚会地点。由于他的信息技能很生疏,他需要你的帮助。

斯拉夫从城市 1 1 1 到城市 n n n 所需的最短时间是多少?斯拉夫没有自行车就无法旅行。保证斯拉夫可以从城市 1 1 1 到达其他任何城市。

思路:

很好的一个变型dijkstra。先放一下dijkstra的证明过程:
请添加图片描述
请添加图片描述
写的很抽象,但是证明思路很明显:如果我们从堆里所有状态中选出走过的路长度最少的状态,如果这个状态所在位置之前还没有被访问过,那么现在这个状态走过的路长度就是最短的,我的意思是,之后到达这个位置的最短路径就再也不可能被刷新了。证明是显然的:现在所有状态走过的路的长度都大于这个状态,我们继续走下去只会使得走的路变长,无论从什么状态来推,之后到达的时候长度一定不可能小于现在的长度了。

一眼看下来感觉应该是个最短路问题,用dijkstra,但是由于我们可以先去一个其他城市买到一个更快的车子,然后用这个车子到达终点,结果可能更优,所以直接跑dij是不对的。

考虑到我们到一个城市的时候只看原点到它的距离,而不看手上的自行车是有可能不优的。但是如果多存储一维自行车的慢速因子来描述我们到这个城市的距离就是最优的了。具体来说,原本的 d i s dis dis 数组设为 d i s [ u ] [ b i k e ] dis[u][bike] dis[u][bike] ,表示到达城市 u u u,手上最快的自行车为 b i k e bike bike 的最短距离,这样 u , b i k e u,bike u,bike 确定时,距离一定是越小越好的,而不会对后面产生影响。

做法就出来了。 d i s dis dis 数组多描述一维自行车的慢速因子,优先队列存储的状态多存储一个手上最快的自行车的信息就可以了。这里因为我们自行车一定是会越来越快的,而我们经过的点最长是,先到一个城市买最快的自行车,再回来走到终点,因此时间复杂度差不多是 O ( 2 n m l o g n ) O(2nmlogn) O(2nmlogn) 的。

到达某个点,带有某个自行车的最近距离,这里其实很像动态规划的思想。不如说,dijkstra本身就很有动态规划的味道。比较类似的有这里的E题

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
typedef long long ll;
const int maxn=1005;
const ll inf=1e9;int T,n,m;int head[maxn],counter;
struct EDGE{int v,w,nxt;
}e[maxn<<1];
void adde(int u,int v,int w){e[++counter].v=v;e[counter].w=w;e[counter].nxt=head[u];head[u]=counter;
}
void init(){cin>>n>>m;memset(head,0,sizeof(head));counter=0;for(int i=1,u,v,w;i<=m;i++){cin>>u>>v>>w;adde(u,v,w);adde(v,u,w);}
}struct node{ll cost;int bike,u;bool operator<(const node &x)const{return (cost==x.cost)?bike>x.bike:cost>x.cost;}
};
int s[maxn];
ll d[maxn][maxn];ll dijkstra(){memset(d,0x3f,sizeof(d));priority_queue<node> h;d[1][s[1]]=0;h.push(node{1,s[1],1});while(!h.empty()){int u=h.top().u,bike=h.top().bike;h.pop();if(u==n)return d[u][bike];if(bike>s[u]){d[u][s[u]]=min(d[u][s[u]],d[u][bike]);bike=s[u];}for(int i=head[u],v,w;i;i=e[i].nxt){v=e[i].v;w=e[i].w;if(d[v][bike]>d[u][bike]+1ll*bike*w){d[v][bike]=d[u][bike]+1ll*bike*w;h.push(node{d[v][bike],bike,v});}}}return inf;
}int main(){cin>>T;while(T--){init();for(int i=1;i<=n;i++)cin>>s[i];cout<<dijkstra()<<endl;}return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/707874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day 59 | 动态规划 583. 两个字符串的删除操作、 72. 编辑距离、编辑距离总结篇

583. 两个字符串的删除操作 题目 文章讲解 视频讲解 class Solution {public int minDistance(String word1, String word2) {int len1 word1.length();int len2 word2.length();int[][] dp new int[len1 1][len2 1];for (int i 1; i < len1; i) {for (int j 1; j …

华纳云:oracle数据库启动与关闭的方法

在Oracle数据库中&#xff0c;您可以使用 SQL*Plus 工具或者 SQL Developer 来启动和关闭数据库实例。以下是在 Oracle 数据库中启动和关闭数据库实例的一般步骤&#xff1a; 启动 Oracle 数据库实例&#xff1a; 使用 SQL*Plus 启动数据库&#xff1a; 打开终端或命令提示符窗…

c++学习:字符串string类

C语言中对字符串的表示通常用指针&#xff0c;新手会面临内存泄漏或者段错误等众多问题。 在 C 中&#xff0c; string 类是标准库的一部分&#xff0c;用于表示和操作字符串。它是对传统的 C 风格字符串&#xff08;以空 字符 \0 结尾的字符数组&#xff09;的一个更安全、更…

防御第六次作业

DPI DPI --- 深度包检测技术 --- 主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之后对数据包的内容进行识别。&#xff08;应用层&#xff09; 1&#xff0c;基于“特征字”的检测技术 --- 最常用的识别手段&#xff0c;基于…

dolphinscheduler海豚调度(三)SQL任务

在之前的博文中&#xff0c;我们已经介绍了DolphinScheduler海豚调度的基本概念和模块&#xff0c;安装部署和元数据切换&#xff0c;以及Shell任务的实践。今天&#xff0c;让我们来深入探讨DolphinScheduler中另一种常见的任务类型&#xff1a;SQL任务。 SQL任务是DolphinSc…

10:00面试,10:05就出来了,问的问题过于变态了。。。

我从一家小公司转投到另一家公司&#xff0c;期待着新的工作环境和机会。然而&#xff0c;新公司的加班文化让我有些始料未及。虽然薪资相对较高&#xff0c;但长时间的工作和缺乏休息使我身心俱疲。 就在我逐渐适应这种高强度的工作节奏时&#xff0c;公司突然宣布了一则令人…

如何做代币分析:以 TRX 币为例

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;TRX 代币仪表板 &#xff08;仅包括以太坊数据&#xff09; 在加密货币和数字资产领域&#xff0c;代币分析起着至关重要的作用。代币分析指的是深入研究与代币相关的数据…

[python] `sys.settrace` 跟踪函数

sys.settrace 是 Python 中的一个调试工具&#xff0c;它允许你设置一个跟踪函数&#xff0c;在程序执行过程中对每个函数调用进行跟踪。当设置了跟踪函数后&#xff0c;Python 解释器在每次函数调用、返回或异常抛出时都会调用该跟踪函数&#xff0c;从而使你能够观察和记录程…

ffmpeg深度学习滤镜

环境搭建 安装显卡驱动 当前所用显卡为NVIDIA的P6000,在英伟达的官网上查看对应的驱动, 下载NVIDIA-Linux-x86_64-535.104.05.run并安装。 sudo ./NVIDIA-Linux-x86_64-535.104.05.run 安装成功后用nvidia-smi命令后查看 安装的cuda版本不能超过12.2,选择安装cuda11.8。…

Netty01NIO

NIO基础 NIO &#xff1a;non-blocking io 非阻塞 IO 笔记 www.zgtsky.top 网课&#xff1a;黑马Netty 三大组件 Channel & Buffer channel 有一点类似于 stream&#xff0c;它就是读写数据的双向通道&#xff0c;可以从 channel 将数据读入 buffer&#xff0c;也可以…

资料分析:常见关系

两数比关系 一、基础概念 1.产销率(工业产品销售率)是指工业企业在一定时期已经销售的产品总量与可供销售的工业产品总量之比。产品销售率是指报告期产品销售量与产品生产量的比率。是反映报告期工业企业产品产销衔接情况&#xff0c;反映产品生产、销售、流通及满足社会需要程…

Linux学习笔记11——用户组添加删除

Linux 是多用户多任务操作系统&#xff0c;换句话说&#xff0c;Linux 系统支持多个用户在同一时间内登陆&#xff0c;不同用户可以执行不同的任务&#xff0c;并且互不影响。 例如&#xff0c;某台 Linux 服务器上有 4 个用户&#xff0c;分别是 root、www、ftp 和 mysql&…

nginx实现http反向代理及负载均衡

目录 一、代理概述 1、代理概念 1.1 正向代理&#xff08;Forward Proxy&#xff09; 1.2 反向代理&#xff08;Reverse Proxy&#xff09; 1.3 正向代理与反向代理的区别 2、同构代理与异构代理 2.1 同构代理 2.2 异构代理 2.3 同构代理与异构代理的区别 二、四层代…

Linux离线安装Ansible

Linux离线安装Ansible 可自行去下载相关包,也可以给我评论留言,我发给大家 python -Vtar -zxvf setuptools-7.0.tar.gz cd setuptools-7.0/ python setup.py installtar -zxvf pycrypto-2.6.1.tar.gz cd pycrypto-2.6.1/ python setup.py install报错时 src/MD2.c:31:20: 致…

使用.NET 升级助手工具将.net framework4.8 MVC项目升级到net6

1 新建.net framework4.8 MVC项目 随便添加一个可以访问的界面用于测试 2 对当前项目进行升级 注意&#xff1a;若要进行升级&#xff0c;首先确保本地已安装相应的sdk&#xff0c;例如&#xff1a;dotnet-sdk-6.0.402-win-x64.exe1.运行cmd命令窗口&#xff0c;进入项目所在…

Ethernet/IP转CC-Link IEFB协议网关

产品功能 1 YC-EIP-CCLKIE工业级EtherNet/IP 网关 2 CC-Link IEFB转 EtherNet/IP 3支持多个CC-Link IEFB节点 4 即插即用 无需编程 轻松组态 ,即实现数据交互 5导轨安装 支持提供EDS文件 6 EtherNET/IP与CC-Link IEFB互转数据透明传输可接入PLC组态 支持CodeSys/支持欧姆…

xss.haozi.me靶场练习

靶场地址alert(1) 1、第一关 输入在文本框里面&#xff0c;我们闭合前面的标签&#xff0c;中间的内容我们就可以随意写了 2、第二关 逃逸value的属性即可&#xff0c;这里使用点击事件触发xss 3、第三关 看代码&#xff0c;使用了正则表达式&#xff0c;去掉了所有的括号字…

使用Java和PostGis的全国A级风景区数据入库实战

目录 前言 一、数据介绍 1、空间数据 2、属性表说明 3、QGIS数据预览 二、PostGIS空间数据库设计 1、空间表结构 三、Java空间入库 1、实体定义 2、数据操作Mapper 3、业务层实现 4、入库 5、数据入库验证 总结 前言 星垂平野阔&#xff0c;月涌大江流”“晴川历历…

SRIO—IP讲解及说明

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、SRIO IP 概述1.1 逻辑层1.1.1 I/O 端口(I/O Port)1.1.2 消息端口(Messaing Port)1.1.3 用户自定义端口(User-Defined Port)1.1.4 维护端口(Maintenance Port)1.2 缓冲层1.3 物理层…

[AIGC] JDK17中的Record类介绍

文章目录 什么是Record类Record类的特点Record类实践 我们都知道&#xff0c;从Java 14开始, JEP 359 推出了一个新的类型声明Record&#xff0c;Record 类型用来模拟不可变的数据结构&#xff0c;它能产生一个类包含一定数量的只读字段。 什么是Record类 在JDK14中引入了一…