You are given an undirected weighted graph of n nodes numbered from 0 to n - 1. The graph consists of m edges represented by a 2D array edges, where edges[i] = [ai, bi, wi] indicates that there is an edge between nodes ai and bi with weight wi.
Consider all the shortest paths from node 0 to node n - 1 in the graph. You need to find a boolean array answer where answer[i] is true if the edge edges[i] is part of at least one shortest path. Otherwise, answer[i] is false.
There is one shortest path between nodes 0 and 3, which is the path 0 -> 2 -> 3 with the sum of weights 1 + 2 = 3.
Constraints:
2 <= n <= 5 * 104
m == edges.length
1 <= m <= min(5 * 104, n * (n - 1) / 2)
0 <= ai, bi < n
ai != bi
1 <= wi <= 105
There are no repeated edges.
Solutions
Solution 1: Heap Optimized Dijkstra
First, we create an adjacency list \(g\) to store the edges of the graph. Then we create an array \(dist\) to store the shortest distance from node \(0\) to other nodes. We initialize \(dist[0] = 0\), and the distance of other nodes is initialized to infinity.
Then, we use the Dijkstra algorithm to calculate the shortest distance from node \(0\) to other nodes. The specific steps are as follows:
Create a priority queue \(q\) to store the distance and node number of the nodes. Initially, add node \(0\) to the queue with a distance of \(0\).
Take a node \(a\) from the queue. If the distance \(da\) of \(a\) is greater than \(dist[a]\), it means that \(a\) has been updated, so skip it directly.
Traverse all neighbor nodes \(b\) of node \(a\). If \(dist[b] > dist[a] + w\), update \(dist[b] = dist[a] + w\), and add node \(b\) to the queue.
Repeat steps 2 and 3 until the queue is empty.
Next, we create an answer array \(ans\) of length \(m\), initially all elements are \(false\). If \(dist[n - 1]\) is infinity, it means that node \(0\) cannot reach node \(n - 1\), return \(ans\) directly. Otherwise, we start from node \(n - 1\), traverse all edges, if the edge \((a, b, i)\) satisfies \(dist[a] = dist[b] + w\), set \(ans[i]\) to \(true\), and add node \(b\) to the queue.
Finally, return the answer.
The time complexity is \(O(m \times \log m)\), and the space complexity is \(O(n + m)\), where \(n\) and \(m\) are the number of nodes and edges respectively.