新增道路查询后的最短距离I

2024-11-19

题目:

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

解释:

img

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

img

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

img

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

示例 2:

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

输出: [1, 1]

解释:

img

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

img

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

提示:

  • 3 <= n <= 500
  • 1 <= queries.length <= 500
  • queries[i].length == 2
  • 0 <= queries[i][0] < queries[i][1] < n
  • 1 < queries[i][1] - queries[i][0]
  • 查询中没有重复的道路。

思路:

	由于图在每个查询都在变化,那么从 0 到 n - 1 的最短路径可能会一直改变,所以需要多次查询
	每次查询通过 bfs 查询最短路径即可

代码:

class Solution {
public:
    int bfs(vector<vector<int>>& graph, int n) {
        vector<bool> visit(n, false);
        queue<pair<int, int>> que;
        que.push(make_pair(0, 0));
        visit[0] = true;
        while (!que.empty()) {
            auto top = que.front();
            if (top.first == n - 1) return top.second;
            que.pop();
            for (int i = 0; i < graph[top.first].size(); i++) {
                if (!visit[graph[top.first][i]]) {
                    que.push(make_pair(graph[top.first][i], top.second + 1));
                    visit[graph[top.first][i]] = true;
                }
            }
        }
        return -1;
    }
    vector<int> shortestDistanceAfterQueries(int n, vector<vector<int>>& queries) {
        vector<vector<int>> graph(n);
        for (int i = 0; i < n - 1; i++) {
            graph[i].push_back(i + 1);
        }
        vector<int> ans(queries.size());
        for (int i = 0; i < queries.size(); i++) {
            graph[queries[i][0]].push_back(queries[i][1]);
            ans[i] = bfs(graph, n);
        }
        return ans;
    }
};