首页 > 其他分享 >3243.新增道路查询的最短距离

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

时间:2024-11-19 23:16:00浏览次数:3  
标签:队列 访问 3243 查询 vis 短距离 queries 节点

给你一个整数 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 = q
                q = []
                for x in tmp:
                    for y in g[x]:
                        if y==n-1:
                            return step
                        if vis[y] !=i:
                            vis[y] = i
                            q.append(y)
            return -1

        ans = [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] + 1
                for 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

标签:队列,访问,3243,查询,vis,短距离,queries,节点
From: https://blog.csdn.net/m0_54373077/article/details/143897345

相关文章

  • 【每日一题】3243. 新增道路查询后的最短距离 I
    给你一个整数 n 和一个二维整数数组 queries。有 n 个城市,编号从 0 到 n-1。初始时,每个城市 i 都有一条单向道路通往城市 i+1( 0<=i<n-1)。queries[i]=[ui,vi] 表示新建一条从城市 ui 到城市 vi 的单向道路。每次查询后,你需要找到从城市 0 到城市......
  • JavaFX + MySQL:动态显示数据库查询结果的JavaFX应用程序
    文章目录示例概述示例代码导入必要的包定义主类和主方法详细解释导入必要的包定义主类和主方法连接数据库并处理查询结果运行效果示例数据库表结构注意事项示例概述我们将创建一个JavaFX应用程序,该应用程序连接到MySQL数据库,查询某个表中的数据,并将结果显示在一......
  • Abp.VNext-拆分查询
    Abp默认采用的是拆分查询,优点是提高性能,缺点是使用Linq进行多表关联操作时打印查询字符串得到的SQL语句是单表查询语句。而实际上代码执行的是多表关联查询,容易误导开发人员。例如下列LINQ查询是多表关联,但是得到的查询字符串是单表操作。varquery=(await_blogRepository.G......
  • MySQL查询慢的根本原因
    这里的表空间呢,指的是独立表空间,在MySQL中,表空间分为2种,分别是共享表空间和独立表空间,不过在MySQL5.6.6及后续版本默认使用的是独立表空间,说白了就是一个独立表空间在磁盘中会单独对应一个表空间文件,而一个表空间文件存放着MYSQL数据库中一张表的数据。在表空间中有很多数......
  • 鸿蒙HarmonyOS实战开发:hilog命令行查询
     鸿蒙NEXT开发实战往期必看文章:一分钟了解”纯血版!鸿蒙HarmonyOSNext应用开发!“非常详细的”鸿蒙HarmonyOSNext应用开发学习路线!(从零基础入门到精通)HarmonyOSNEXT应用开发案例实践总结合(持续更新......)HarmonyOSNEXT应用开发性能优化实践总结(持续更新......)HiLog日......
  • SeaCMS(海洋CMS)存在MySQL慢查询漏洞(CNVD-2024-39253、CVE-2024-46640)
    SeaCMS(海洋CMS)是一款开源免费PHP影视系统,因其功能强大,操作使用简单,拥有大量用户。 国家信息安全漏洞共享平台于2024-09-26公布其存在MySQL慢查询漏洞。漏洞编号:CNVD-2024-39253、CVE-2024-46640影响产品:SeaCMS(海洋CMS) 13.2漏洞级别:高公布时间:2024-09-26漏洞描述:攻击者可......
  • cmu15545笔记-查询优化(Query Optimization)
    目录概述Heuristics/RulesCost-basedSearchSinglerelationMutiplerelationGenertive/Bottom-UpTransformation/Top-DownNestedsub-queriesDecomposingQueriesExpression/QueriesRewritingStatistics概述数据库系统的执行流程:从优化器到磁盘所设计的步骤:查询......
  • 深入探索高级SQL技巧:解锁数据查询与分析的无限可能
    深入探索高级SQL技巧:解锁数据查询与分析的无限可能在当今数据驱动的时代,SQL(StructuredQueryLanguage)作为数据库管理和查询的基础语言,其重要性不言而喻。然而,仅仅掌握基本的SELECT、INSERT、UPDATE、DELETE等操作,已难以满足复杂的数据处理需求。本文将深入探讨几个高级SQL......
  • flask毕设城市轨道交通线路查询(论文+程序)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着城市化进程的加速,城市轨道交通作为城市交通系统的重要组成部分,其便捷性和高效性日益受到市民的重视。然而,面对日益复杂的城市轨道交通......
  • MySQL进阶:SQL高级技巧 - CTE和递归查询
    ......