100379.新增道路查询后的最短距离I

news2024/10/2 16:16:30

今天看到很有意思的一个题目,记录下来,供大家参考

题目描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

解题思路

为了解决这个问题,我们需要处理一系列的单向道路添加操作,并在每次添加后计算从城市 0 到城市 n-1 的最短路径长度。由于初始时每个城市 i 都有一条到 i+1 的单向道路,所以初始的最短路径长度就是 n-1(直接沿着这条链走)。

然而,当我们添加新的单向道路时,可能会缩短这个路径。为了高效地处理这些更新和查询,我们可以使用并查集(Union-Find)数据结构来维护城市之间的连通性和路径长度。但是,由于并查集通常不直接支持查询两点之间的最短路径长度,我们需要稍微修改一下这个数据结构或结合其他方法来达到目的。

然而,在这个特定的问题中,我们可以采用一种更简单但可能不是最优解的方法:使用图的遍历(如 Dijkstra 算法或 Floyd-Warshall 算法)来在每次添加新边后重新计算最短路径。由于题目中的 nqueries 的大小限制可能允许这种方法的实现(尽管可能不是最高效的),我们可以选择实现这种方法。

但考虑到实现的复杂性和效率,我将给出一个基于简单图遍历(而非完全优化的算法)的解答框架。对于更高效的解决方案,可能需要使用更复杂的图算法和数据结构。

下面是一个基于每次查询后重新计算最短路径的 Python 示例代码:

def find_shortest_path(n, queries):
    # 初始化图,由于初始时只有 i 到 i+1 的路,这里我们实际上不需要显式存储
    # 但为了处理查询,我们可以使用一个邻接表来存储图
    graph = [[] for _ in range(n)]
    for i in range(n - 1):
        graph[i].append(i + 1)

    def dijkstra(start):
        # 简单的 Dijkstra 实现
        distances = [float('inf')] * n
        distances[start] = 0
        visited = [False] * n
        
        from heapq import heappop, heappush
        priority_queue = [(0, start)]
        
        while priority_queue:
            current_distance, current_node = heappop(priority_queue)
            
            if visited[current_node]:
                continue
            
            visited[current_node] = True
            
            for neighbor in graph[current_node]:
                distance = current_distance + 1
                
                if distance < distances[neighbor]:
                    distances[neighbor] = distance
                    heappush(priority_queue, (distance, neighbor))
        
        return distances[-1]  # 返回从 start 到 n-1 的最短距离

    result = []
    for query in queries:
        u, v = query
        # 添加新边
        graph[u].append(v)
        # 重新计算最短路径
        shortest_path_length = dijkstra(0)
        result.append(shortest_path_length)

    return result

# 示例
n = 5
queries = [[2, 3], [1, 4], [3, 1], [0, 4]]
print(find_shortest_path(n, queries))

注意:上述代码中的 Dijkstra 算法实现是为了简化问题而设计的,并没有进行过多的优化。在实际应用中,对于频繁更新和查询的图,可能需要考虑使用更高效的图算法和数据结构,如动态图算法或增量式最短路径算法。

此外,如果 nqueries 的规模非常大,上述方法可能会因为重复计算而效率较低。在这种情况下,可以考虑使用更高级的数据结构或算法,如使用边松弛技术结合优先队列来优化 Dijkstra 算法,或者考虑使用 Floyd-Warshall 算法(尽管其时间复杂度较高,但可以在常数时间内回答任意两点间的最短路径查询)。

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

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

相关文章

【C++高阶】:C++11的深度解析下

✨ 彼方尚有荣光在&#xff0c;何须悲叹少年轻 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&…

浅谈 Spring AOP框架 (1)

文章目录 一、什么是 Spring AOP二、为什么要使用 Spring AOP三、AOP 的一些应用场景四、AOP 的组成五、如何使用 Spring AOP六、Spring AOP 的实现原理6.1、JDK 和 CGLIB 的区别 一、什么是 Spring AOP AOP (Aspect Oriented Programming) &#xff1a;面向切面编程&#xff…

[CTF]-PWN:格式化字符串漏洞题综合解析

printf型格式化字符串漏洞&#xff1a; 任意地址写&#xff1a; 32位&#xff1a; 例题&#xff08;inndy_echo&#xff09;&#xff1a; 有格式化字符串漏洞&#xff0c;可以修改printf的got表内地址为system&#xff0c;传参getshell 解法一&#xff1a; 在32位中可以使…

C语言 操作符

操作符分多种&#xff1a;算术操作符&#xff0c;移位操作符&#xff0c;位操作符&#xff0c;赋值操作符&#xff0c;单目操作符&#xff0c;关系操作符&#xff0c;逻辑操作符&#xff0c;条件操作符&#xff0c;逗号表达式&#xff0c;下标引用&#xff0c;函数调用和结构成…

【Web开发手礼】探索Web开发的秘密(十四)-Vue2(1)Node.js的安装、Vue入门

主要介绍了Node.js的安装教程、Vue2常用的一些指令、声明周期&#xff01;&#xff01;&#xff01; 文章目录 前言 Node.js安装 选择安装目录 验证NodeJS环境变量 配置npm的全局安装路径 切换npm的淘宝镜像 安装Vue-cli ​编辑 Vue2入门 引入vue.js文件 入门代码 常用指令 生…

眼在手外-机器人坐标系与相机坐标系标定方法

1 眼在手外坐标系概述 实现机械臂和相机的手眼标定&#xff0c;就是要通过双目相机坐标系、机械臂坐标系和机械臂 末端执行器三者的坐标系转换&#xff0c;求出手眼转换矩阵。设双目相机坐标系为 Oc&#xff0c;标定板坐标 系为 Ow&#xff0c;末端执行器坐标系为 Oe&#xff0…

【学习笔记】Day 3

一、进度概述 1、作业1 2、组会会议纪要——没太听懂&#xff0c;得再看 二、详情 1、作业1 &#xff08;1&#xff09;在python中&#xff0c;想要使output为图片&#xff0c;需要用的matplotlib库&#xff0c;这里做简单的整理&#xff0c;以便更好的理解代码。 …

ADC的介绍和工作原理

一&#xff0c;什么是ADC&#xff1f; Analog-to-Digital Converter&#xff0c;指模拟/数字转换器 什么是ADC&#xff1a; ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 SUCH AS: 12 位 ADC 是一种逐次逼近…

免费【2024】springboot 导师选择管理系统的管理设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

从零入门 AI for Science(AI+药物) 笔记 #Datawhale AI 夏令营

&#x1f496;使用平台 我的Notebook 魔搭社区 https://modelscope.cn/my/mynotebook/preset . 魔搭高峰期打不开Task3又换回飞桨了 吧torch 架构换成了 飞桨的paddle 飞桨AI Studio星河社区-人工智能学习与实训社区 https://aistudio.baidu.com/projectdetail/8191835?cont…

解决电脑数字小键盘经常自动关闭的问题

本文解决了电脑数字小键盘经常自动关闭的问题&#xff0c;可供大家参考。 winR&#xff0c;输入regedit打开注册表 依次选择HKEY_USERS DEFAULT Control Panel---Keyboard”&#xff0c;将InitialKeyboardIndicators的值由2147483648改为80000002&#xff0c;即可解决。

xss漏洞(四,xss常见类型)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言&#xff1a; 1&#xff0c;本文基于dvwa靶场以及PHP study进行操作&#xff0c;靶场具体搭建参考上一篇&#xff1a; xss漏洞&#xff08;二&#xff0c;xss靶场搭建以及简单…

[240804] OpenTofu 1.8.0 发布,带来更友好的编码体验 | 生成式 AI 滥用现象分析

目录 OpenTofu 1.8.0 发布&#xff0c;带来更友好的编码体验生成式 AI 滥用现象分析 OpenTofu 1.8.0 发布&#xff0c;带来更友好的编码体验 OpenTofu 1.8.0 现已发布&#xff0c;主要功能包括&#xff1a; 变量和局部值的早期求值: 现在可以在模块源、后端配置和状态加密等更…

西部数据HDD和闪存业务均在复苏加速

财务概览 西部数据&#xff08;Western Digital&#xff09;截至2024年7月341日的第四财季营收达到37.6亿美元&#xff0c;同比增长41%&#xff0c;超出预期的33亿美元&#xff0c;净利润达到3.3亿美元&#xff0c;与去年同期亏损7.15亿美元形成鲜明对比。整个2024财年的营收增…

C语言初阶(12)

1.调试的基本 调试是发现并解决C语言编译的bug的方法。 调试基本步骤是1.发现程序错误的存在 2.以隔离、消除等方式对错误进行定位 3.确定错误产生的原因 4.提出纠正错误的解决办法 5.对程序错误予以改正&#xff0c;重新测试 编译版本release和debug版本&#xff0c;releas…

一例AutoHotkey语言生成的文件夹病毒分析

概述 这是一个使用AutoHotkey语言编写的文件夹病毒&#xff0c;使用ftp服务器来当作C2&#xff0c;通过U盘传播&#xff0c;样本很古老&#xff0c;原理也很简单&#xff0c;这种语言的样本还是第一次见到&#xff0c;记录一下。 样本的基本信息 PE32库: AutoIt(3.XX)[-]编译…

Cocos Creator2D游戏开发(11)-飞机大战(9)-cocos发布微信小游戏

准备工作: ① cocosCreator ②微信小游戏开发者工具 第一步: cocosCreator 打包编译,设置发布平台,默认场景,设备方向,AppId 最后点击构建 等待构建完成 第二步: 导入微信开发者工具 就是cocos Creator 中构建发布里面的发布路径 然后编译: 剩下的就是微信开发者工具…

Bootstrap框架介绍

1、Bootstrap框架的下载和使用 Bootstrap框架是基于HTML、CSS、JavaScript的CCS/HTML框架,是一种封装好的前端框架。它包括js、css、front字体样式库。该框架下载链接:https://v3.bootcss.com/getting-started/#download,并选择下载源码。 建一个BootstrapDemo文件夹,将js…

反激式电源为什么上电最容易烧MOS管?

大家好,这里是大话硬件。 这篇文章总结一下最近在研究的反激电源RCD吸收回路和VDS尖峰问题。这也是为什么MOS管在开机容易被电压应力击穿的原因。 下图是反激电源变压器部分的拓扑。 在MOS开通时,VDS上电压: 由于Rdson比较小,MOS开通时,VDS电压也较小。此时,MOS漏极电…

对象存储及其相关概念介绍

对象存储是一种用来描述解决和处理离散单元&#xff08;这些离散单元被称作为对象&#xff09;的方法的通用术语。以下是关于对象存储的详细解析&#xff1a; 一、基本概念 定义&#xff1a;对象存储&#xff0c;也叫做基于对象的存储&#xff0c;是一种将数据以对象的形式进…