3243.新增道路查询的最短距离

给你一个整数 n 和一个二维整数数组 queries

有 n 个城市,编号从 0 到 n - 1。初始时,每个城市 i 都有一条单向道路通往城市 i + 1( 0 <= i < n - 1)。

queries[i] = [ui, vi] 表示新建一条从城市 ui 到城市 vi 的单向道路。每次查询后,你需要找到从城市 0 到城市 n - 1 的最短路径长度

返回一个数组 answer,对于范围 [0, queries.length - 1] 中的每个 ianswer[i] 是处理完 i + 1 个查询后,从城市 0 到城市 n - 1 的最短路径的长度

示例 1:

输入: n = 5, queries = [[2, 4], [0, 2], [0, 4]]

输出: [3, 2, 1]

解释:

新增一条从 2 到 4 的道路后,从 0 到 4 的最短路径长度为 3。

新增一条从 0 到 2 的道路后,从 0 到 4 的最短路径长度为 2。新增一条从 0 到 4 的道路后,从 0 到 4 的最短路径长度为 1。

代码:

class Solution:def shortestDistanceAfterQueries(self, n: int, queries: List[List[int]]) -> List[int]:g = [[i+1] for i in range(n-1)]vis =[-1]*(n-1)def bfs(i:int)->int:   #广度优先搜索q = deque([0])for step in count(1):tmp = qq = []for x in tmp:for y in g[x]:if y==n-1:return stepif vis[y] !=i:vis[y] = iq.append(y)return -1ans = [0]*len(queries)for i,(l,r) in enumerate(queries):g[l].append(r)ans[i] = bfs(i)return ans

对于广度优先搜索代码每一运行的说明

通过一个具体的例子来演示bfs函数的运行过程。假设我们有以下简化的数据和查询:

  • 数组长度 n = 5,所以数组索引从0到4。
  • 图 g 初始化为:[[1], [2], [3], [4]],表示每个索引指向下一个索引。
  • 查询 queries = [[1, 3]],表示在索引1和3之间增加一个连接。
  • vis 初始化为 [-1, -1, -1, -1]

现在,我们执行查询 [1, 3] 后,更新图 g 为:[[1], [2, 3], [3], [4]]

接下来,我们调用 bfs(0) 来找到从索引0到索引4的最短路径长度。

初始化

  • q = deque([0]):队列初始化,包含起始节点0。
  • vis = [-1, -1, -1, -1]:访问数组初始化,表示所有节点都未被访问过。

第一步(step = 1)

  • 从队列中取出节点0,访问其邻居 [1]
  • 将节点1加入队列,q = deque([1])
  • 标记节点1为已访问,vis = [-1, 0, -1, -1]

第二步(step = 2)

  • 从队列中取出节点1,访问其邻居 [2, 3]
  • 将节点2和3加入队列,q = deque([2, 3])
  • 标记节点2和3为已访问,vis = [-1, 0, 0, 0]

第三步(step = 3)

  • 从队列中取出节点2,访问其邻居 [3]。由于节点3已在队列中,我们不再重复添加。
  • 节点3已经在队列中,我们不需要再次处理。
  • 从队列中取出节点3,访问其邻居 [4]
  • 将节点4加入队列,q = deque([4])
  • 标记节点4为已访问,vis = [-1, 0, 0, 0, 0]

第四步(step = 4)

  • 从队列中取出节点4,没有未访问的邻居。

        在这一步,我们发现无法从节点4继续前进,因为所有节点都已访问过。但是,我们的目标是找到从节点0到节点4的最短路径。在第三步中,我们已经找到了这条路径:0 -> 1 -> 2 -> 3 -> 4。

        因此,bfs函数返回的步数是3,表示从节点0到节点4的最短路径需要3步。

        请注意,这个例子是为了演示bfs函数的运行过程而简化的。在实际的shortestDistanceAfterQueries问题中,图的更新和BFS的执行会更加复杂,因为每次查询都可能影响图的结构。

        这里,节点 1 现在有两个邻居:节点 2 和节点 3。这种更新模拟了查询操作,即在位置 1 和位置 3 之间的元素距离减少,因为现在存在一条直接的连接。而且通常这使用于无向图。

一些细节

  1. for y in g[x]::这行代码遍历当前节点x的所有邻居节点yg[x]是一个列表,包含了节点x直接连接的所有节点。

  2. if y==n-1: return step:这行代码检查当前节点y是否是数组的结束位置(索引n-1)。如果是,这意味着我们找到了从起始位置到结束位置的一条路径,并且step变量记录了这条路径的长度(步数)。一旦找到路径,函数就返回当前的步数。

  3. if vis[y] != i::这行代码检查节点y是否已经被当前的查询i访问过。vis数组用于跟踪每个节点在当前查询中是否被访问过,以避免重复访问和无限循环。

  4. vis[y] = i:如果节点y没有被当前查询访问过,这行代码将vis[y]设置为当前查询的索引i,标记节点y为已访问。

  5. q.append(y):将未访问的邻居节点y添加到队列q的末尾。在下一次迭代中,这些节点将被处理,它们的邻居也将被检查。

思路2:动态规划

class Solution:def shortestDistanceAfterQueries(self, n: int, queries: List[List[int]]) -> List[int]:frm = [[] for _ in range(n)]f = list(range(n))ans = []for l, r in queries:frm[r].append(l)if f[l] + 1 < f[r]:f[r] = f[l] + 1for i in range(r + 1, n):f[i] = min(f[i], f[i - 1] + 1, min((f[j] for j in frm[i]), default=inf) + 1)ans.append(f[-1])return ans

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

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

相关文章

MySQL - 表的约束

文章目录 1、空约束2.默认值3.列描述4.zerofill5.主键6.自增长7.唯一键8.外键 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据的正确性。比如有一个字段是…

VirtualBox安装虚拟机Windows server 2019系统只显示cmd命令窗口

原因&#xff1a; 没注意选用了核心安装选项&#xff0c;此选项不安装图形界面 解决&#xff1a; 方式一&#xff1a;重装虚拟机&#xff0c;选用有图形界面的版本 方式二&#xff1a;在cmd窗口中安装图形界面 Dism /online /enable-feature /all /featurename:Server-Gui-Mgm…

基于卷积神经网络的皮肤病识别系统(pytorch框架,python源码,GUI界面,前端界面)

更多图像分类、图像识别、目标检测等项目可从主页查看 功能演示&#xff1a; 皮肤病识别系统 vgg16 resnet50 卷积神经网络 GUI界面 前端界面&#xff08;pytorch框架 python源码&#xff09;_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积神经网络的皮肤病识…

MixVpr重定位实战----onnx以及Tensorrt适配

0. 简介 对于深度学习而言&#xff0c;通过模型加速来嵌入进C是非常有意义的&#xff0c;因为本身训练出来的pt文件其实效率比较低下&#xff0c;在讲完BEVDET和FastBEV后&#xff0c;这里我们将展开实战&#xff0c;从pt到onnx再到tensorrt&#xff0c;以MixVpr作为例子&…

Java基于微信小程序的校园跑腿平台(V2.0)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Spring Boot图书馆管理系统:疫情中的管理利器

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了疫情下图书馆管理系统的开发全过程。通过分析疫情下图书馆管理系统管理的不足&#xff0c;创建了一个计算机管理疫情下图书馆管理系统的方案。文章介绍了疫情下图…

【CUDA】Branch Divergence and Unrolling Loop

目录 一、避免分支发散 1.1 并行规约问题 1.2 并行规约中的发散 二、UNrolling Loops 一、避免分支发散 控制流有时依赖于 thread 索引。同一个warp中&#xff0c;一个条件分支可能导致性能很差。通过重新组织数据获取模式可以减少或避免 warp divergence。具体问题查看下…

WIN系统解决小喇叭红色叉号的办法

WIN系统解决小喇叭红色叉号的办法 WIN系统提示无音频设备&#xff0c;无法播放声音&#xff0c;重装驱动无法解决 写在前面 前段时间搞了套6750GRE&#xff0c;用了两三个月&#xff0c;老是掉驱动&#xff0c;后面折腾了一下子&#xff0c;终于是不掉了。突然&#xff0c;某…

免费S3客户端工具大赏

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;S3免费客户端工具大赏 1. S3 GUI GitHub地址&#xff1a;https://github.com/aminalaee/s3gui 简介&#xff1a;S3 GUI 是一款基于 Flutter 构建的免费开源 S3 桌面客户端&#xff0c;支持桌面、移动和网络平台。 特…

uniapp 购物弹窗组件 (微信小程序)

效果图&#xff0c;暂时只适应单规格&#xff0c;居中弹出和下方弹出&#xff0c;如需求不满足&#xff0c;请自行修改代码 &#xff08;更新于24/11/15) 居中显示效果 下方弹出效果 html <template><view class"" v-if"show":class"mod…

力扣-Mysql-1811 - 寻找面试候选人(中等)

一、题目来源 1811. 寻找面试候选人 - 力扣&#xff08;LeetCode&#xff09; 二、数据表结构 表: Contests -------------------- | Column Name | Type | -------------------- | contest_id | int | | gold_medal | int | | silver_medal | int | | bronze_medal | …

【C语言】volatile 防止编译的时候被优化

volatile 易变的 volatile是 C 和 C 中的一个类型修饰符&#xff0c;用于指示编译器该变量可能在程序之外被更改&#xff0c;因此不应对其进行优化。这在涉及硬件寄存器、信号处理或多线程编程时非常有用。 如果你做过单片机开发&#xff0c;你肯定写过这样的代码&#xff1a;…

makefile速通

makefile速通 文章目录 makefile速通1.基础显式规则隐含规则%*通配符 赋值 伪目标CFLAGS 2.函数wildcardpatsubst 3.项目实例 1.基础 显式规则 目标文件&#xff1a;依赖文件 [TAB] 指令隐含规则 % 任意* 所有通配符 符号含义$^所有依赖文件$所有目标文件$<所有依赖文…

面向服务的软件工程——巨详细讲解商务流程建模符号 (BPMN),一篇章带你入门BPMN!!!(week1)

文章目录 一、前言二、重点概念三、BPMN元素讲解流对象1.活动任务(Task)子流程(sub-process)多实例活动连接对象序列流消息流关联泳道Artifacts数据对象组(Group)事件(Events)启动事件中间事件结束事件边界事件边界事件1边界事件2小疑问?网关参考文献:一、前言 在我们…

模拟实现~简易通讯录

一.前言 今天给小伙伴们分享的是运用结构体以及指针等相关C语言知识实现一个简易版的通讯录。咱们写的通讯录的功能主要包括添加及删除联系人&#xff0c;修改联系人信息&#xff0c;显现所有联系人&#xff0c;查找已添加联系人&#xff0c;以及对联系人进行排序&#xff0c;…

0成本添加访问级监控

互联网的安全感这个概念源于阿里。顾名思义&#xff0c;让互联网的用户对于web产品能够产生足够的信任和依赖。特别是涉及到用户资金交易的站点&#xff0c;一次严重的用户资料泄露就可以彻底毁掉你的品牌。 然而当前阶段除了bat大部分互联网行业的企业对于网络安全给的重视都…

分布式系统稳定性建设-性能优化篇

分布式系统稳定性建设-性能优化篇 系统稳定性建设是系统工程的核心内容之一。以下是一些重要的方面: 架构设计: 采用模块化、松耦合的架构设计,以提高系统的可扩展性和可维护性。合理划分系统功能模块,降低单个模块的复杂度。定义清晰的接口和数据交换标准,确保各模块之间协调…

Web端高效BIM 3D可视化引擎HOOPS Communicator技术解析!

HOOPS Communicator是一款简单而强大的工业级高性能3D Web可视化开发包&#xff0c;专注于Web端工程图形渲染。采用了先进的流式加载方式&#xff0c;并支持服务端和客户端渲染&#xff0c;是可以在云端进行部署和无缝集成的新技术平台。 灵活且易于部署&#xff0c;可在以工程…

C/C++实现tcp客户端和服务端的实现(从零开始写自己的高性能服务器)

目录 tcp客户端通信流程 tcp客户端设计 1、创建通信对象 2、链接服务器 3、发送数据 / 读取数据 4、关闭通信 tcp服务端设计 1、创建通信对象 2、绑定服务器地址信息 3、设置服务器为监听模式 4、接收客户的链接请求 编写tcp客户端和服务端&#xff0c;实现双向通信…

C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程

引言 C 标准模板库&#xff08;STL&#xff09;提供了一组功能强大的容器类&#xff0c;用于存储和操作数据集合。不同的容器具有独特的特性和应用场景&#xff0c;因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C 的开发者来说&#xff0c;了解这些容…