#3243
Medium Algorithms Shortest distance after road addition queries i
Array Breadth-First Search Graph Theory
61.9% acceptance
Feb 25, 2026
634
29
You are given an integer n and a 2D integer array queries.
There are n cities numbered from 0 to n - 1. Initially, there is a unidirectional road from city i to city i + 1 for all 0 <= i < n - 1.
queries[i] = [ui, vi] represents the addition of a new unidirectional road from city ui to city vi. After each query, you need to find the length of the shortest path from city 0 to city n - 1.
Return an array answer where for each i in the range [0, queries.length - 1], answer[i] is the length of the shortest path from city 0 to city n - 1 after processing the first i + 1 queries.
Solution
Rust
Time O(n * m)
Space O(n * m)
impl Solution {
pub fn shortest_distance_after_queries(n: i32, queries: Vec<Vec<i32>>) -> Vec<i32> {
let n = n as usize;
let mut extra: Vec<Vec<usize>> = vec![vec![]; n];
let mut result = Vec::with_capacity(queries.len());
for q in &queries {
extra[q[0] as usize].push(q[1] as usize);
// BFS from 0 to n-1
let mut dist = vec![i32::MAX; n];
dist[0] = 0;
let mut queue = std::collections::VecDeque::new();
queue.push_back(0usize);
while let Some(u) = queue.pop_front() {
let d = dist[u];
// built-in edge u -> u+1
if u + 1 < n && dist[u + 1] == i32::MAX {
dist[u + 1] = d + 1;
queue.push_back(u + 1);
}
// extra edges
for &v in &extra[u] {
if dist[v] == i32::MAX {
dist[v] = d + 1;
queue.push_back(v);
}
}
}
result.push(dist[n - 1]);
}
result
}
}