Skip to content

Commit d612db5

Browse files
authored
Create shortest-distance-after-road-addition-queries-i.cpp
1 parent ba055a4 commit d612db5

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// Time: O(n^2)
2+
// Space: O(n^2)
3+
4+
// bfs
5+
class Solution {
6+
public:
7+
vector<int> shortestDistanceAfterQueries(int n, vector<vector<int>>& queries) {
8+
vector<vector<int>> adj(n);
9+
for (int u = 0; u + 1 < n; ++u) {
10+
adj[u].emplace_back(u + 1);
11+
}
12+
vector<int> dist(n);
13+
iota(begin(dist), end(dist), 0);
14+
const auto& bfs = [&](int u, int v) {
15+
adj[u].emplace_back(v);
16+
vector<int> q = {u};
17+
while (!empty(q)) {
18+
vector<int> new_q;
19+
for (const auto& u : q) {
20+
for (const auto& v : adj[u]) {
21+
if (dist[u] + 1 >= dist[v]) {
22+
continue;
23+
}
24+
dist[v] = dist[u] + 1;
25+
new_q.emplace_back(v);
26+
}
27+
}
28+
q = move(new_q);
29+
}
30+
return dist[n - 1];
31+
};
32+
33+
vector<int> result;
34+
result.reserve(n);
35+
for (const auto& q : queries) {
36+
result.emplace_back(bfs(q[0], q[1]));
37+
}
38+
return result;
39+
}
40+
};
41+
42+
// Time: O(n^2 * logn)
43+
// Space: O(n^2)
44+
// dijkstra's algorithm
45+
class Solution2 {
46+
public:
47+
vector<int> shortestDistanceAfterQueries(int n, vector<vector<int>>& queries) {
48+
vector<vector<pair<int, int>>> adj(n);
49+
for (int u = 0; u + 1 < n; ++u) {
50+
adj[u].emplace_back(u + 1, 1);
51+
}
52+
vector<int> dist(n);
53+
iota(begin(dist), end(dist), 0);
54+
const auto& dijkstra = [&](int u, int v) {
55+
adj[u].emplace_back(v, 1);
56+
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> min_heap;
57+
min_heap.emplace(dist[u], u);
58+
while (!empty(min_heap)) {
59+
const auto [curr, u] = min_heap.top(); min_heap.pop();
60+
if (curr > dist[u]) {
61+
continue;
62+
}
63+
for (const auto& [v, w] : adj[u]) {
64+
if (curr + w >= dist[v]) {
65+
continue;
66+
}
67+
dist[v] = curr + w;
68+
min_heap.emplace(dist[v], v);
69+
}
70+
}
71+
return dist[n - 1];
72+
};
73+
74+
vector<int> result;
75+
result.reserve(n);
76+
for (const auto& q : queries) {
77+
result.emplace_back(dijkstra(q[0], q[1]));
78+
}
79+
return result;
80+
}
81+
};

0 commit comments

Comments
 (0)