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]
中的每個 i
,answer[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]