【每日一題】3244. 新增道路查詢後的最短距離 II

xiaoxinlong發表於2024-11-20

3244. 新增道路查詢後的最短距離 II

給你一個整數 n 和一個二維整數陣列 queries

n 個城市,編號從 0n - 1。初始時,每個城市 i 都有一條單向道路通往城市 i + 10 <= 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]

相關文章