3112. Minimum Time to Visit Disappearing Nodes
Description
There is an undirected graph of n
nodes. You are given a 2D array edges
, where edges[i] = [ui, vi, lengthi]
describes an edge between node ui
and node vi
with a traversal time of lengthi
units.
Additionally, you are given an array disappear
, where disappear[i]
denotes the time when the node i
disappears from the graph and you won't be able to visit it.
Note that the graph might be disconnected and might contain multiple edges.
Return the array answer
, with answer[i]
denoting the minimum units of time required to reach node i
from node 0. If node i
is unreachable from node 0 then answer[i]
is -1
.
Example 1:
Input: n = 3, edges = [[0,1,2],[1,2,1],[0,2,4]], disappear = [1,1,5]
Output: [0,-1,4]
Explanation:
We are starting our journey from node 0, and our goal is to find the minimum time required to reach each node before it disappears.
- For node 0, we don't need any time as it is our starting point.
- For node 1, we need at least 2 units of time to traverse
edges[0]
. Unfortunately, it disappears at that moment, so we won't be able to visit it. - For node 2, we need at least 4 units of time to traverse
edges[2]
.
Example 2:
Input: n = 3, edges = [[0,1,2],[1,2,1],[0,2,4]], disappear = [1,3,5]
Output: [0,2,3]
Explanation:
We are starting our journey from node 0, and our goal is to find the minimum time required to reach each node before it disappears.
- For node 0, we don't need any time as it is the starting point.
- For node 1, we need at least 2 units of time to traverse
edges[0]
. - For node 2, we need at least 3 units of time to traverse
edges[0]
andedges[1]
.
Example 3:
Input: n = 2, edges = [[0,1,1]], disappear = [1,1]
Output: [0,-1]
Explanation:
Exactly when we reach node 1, it disappears.
Constraints:
1 <= n <= 5 * 104
0 <= edges.length <= 105
edges[i] == [ui, vi, lengthi]
0 <= ui, vi <= n - 1
1 <= lengthi <= 105
disappear.length == n
1 <= disappear[i] <= 105
Solutions
Solution 1: Heap-Optimized Dijkstra
First, we create an adjacency list \(\textit{g}\) to store the edges of the graph. Then, we create an array \(\textit{dist}\) to store the shortest distances from node \(0\) to other nodes. Initialize \(\textit{dist}[0] = 0\), and the distances for the rest of the nodes are initialized to infinity.
Next, we use the Dijkstra algorithm to calculate the shortest distances from node \(0\) to other nodes. The specific steps are as follows:
- Create a priority queue \(\textit{pq}\) to store the distances and node numbers. Initially, add node \(0\) to the queue with a distance of \(0\).
- Remove a node \(u\) from the queue. If the distance \(du\) of \(u\) is greater than \(\textit{dist}[u]\), it means \(u\) has already been updated, so we skip it directly.
- Iterate through all neighbor nodes \(v\) of node \(u\). If \(\textit{dist}[v] > \textit{dist}[u] + w\) and \(\textit{dist}[u] + w < \textit{disappear}[v]\), then update \(\textit{dist}[v] = \textit{dist}[u] + w\) and add node \(v\) to the queue.
- Repeat steps 2 and 3 until the queue is empty.
Finally, we iterate through the \(\textit{dist}\) array. If \(\textit{dist}[i] < \textit{disappear}[i]\), then \(\textit{answer}[i] = \textit{dist}[i]\); otherwise, \(\textit{answer}[i] = -1\).
The time complexity is \(O(m \times \log m)\), and the space complexity is \(O(m)\). Here, \(m\) is the number of edges.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|