【每日一题】3244. 新增道路查询后的最短距离 II

3244. 新增道路查询后的最短距离 II

 

给你一个整数 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。

示例 2:

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

输出: [1, 1]

解释:

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

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

 

class Solution:
    def shortestDistanceAfterQueries(self, n: int, queries: List[List[int]]) -> List[int]:
        roads = [i + 1 for i in range(n)]
        res = []
        dist = n - 1
        for query in queries:
            k = roads[query[0]]
            roads[query[0]] = query[1]
            while k != -1 and k < query[1]:
                roads[k], k = -1, roads[k]
                dist -= 1
            res.append(dist)
        return res


class Solution:
    def shortestDistanceAfterQueries(self, n: int, queries: List[List[int]]) -> List[int]:
        neighbors = [[i + 1] for i in range(n)]
        neighbors[-1] = []
        res = []
        for (u,v) in queries:
            neighbors[u].append(v)
            res.append(self.bfs(n,neighbors))
        return res
    
    def bfs(self, n, neighbors):
        dist = [-1 for _ in range(n)]
        dist[0] = 0
        q = deque([0])
        while len(q) > 0:
            x = q.popleft()
            for y in neighbors[x]:
                if dist[y]>=0:
                    continue
                q.append(y)
                dist[y] = dist[x] + 1
        return dist[n-1]

 

posted @ 2024-11-20 23:59  xiaoxinlong  阅读(1)  评论(0编辑  收藏  举报