Problem
You are given an undirected weighted connected graph containing n
nodes labeled from 0
to n - 1
, and an integer array edges
where edges[i] = [ai, bi, wi]
indicates that there is an edge between nodes ai
and bi
with weight wi
.
Some edges have a weight of -1
(wi = -1
), while others have a positive weight (wi > 0
).
Your task is to modify all edges with a weight of -1
by assigning them **positive integer values **in the range [1, 2 * 109]
so that the shortest distance between the nodes source
and destination
becomes equal to an integer target
. If there are multiple modifications that make the shortest distance between source
and destination
equal to target
, any of them will be considered correct.
Return **an array containing all edges (even unmodified ones) in any order if it is possible to make the shortest distance from *source
* to destination
equal to target
, or an empty array if it's impossible.**
Note: You are not allowed to modify the weights of edges with initial positive weights.
Example 1:
Input: n = 5, edges = [[4,1,-1],[2,0,-1],[0,3,-1],[4,3,-1]], source = 0, destination = 1, target = 5
Output: [[4,1,1],[2,0,1],[0,3,3],[4,3,1]]
Explanation: The graph above shows a possible modification to the edges, making the distance from 0 to 1 equal to 5.
Example 2:
Input: n = 3, edges = [[0,1,-1],[0,2,5]], source = 0, destination = 2, target = 6
Output: []
Explanation: The graph above contains the initial edges. It is not possible to make the distance from 0 to 2 equal to 6 by modifying the edge with weight -1. So, an empty array is returned.
Example 3:
Input: n = 4, edges = [[1,0,4],[1,2,3],[2,3,5],[0,3,-1]], source = 0, destination = 2, target = 6
Output: [[1,0,4],[1,2,3],[2,3,5],[0,3,1]]
Explanation: The graph above shows a modified graph having the shortest distance from 0 to 2 as 6.
Constraints:
1 <= n <= 100
1 <= edges.length <= n * (n - 1) / 2
edges[i].length == 3
0 <= ai, bi < n
wi = -1
or1 <= wi <= 107
ai != bi
0 <= source, destination < n
source != destination
1 <= target <= 109
- The graph is connected, and there are no self-loops or repeated edges
Solution (Java)
class Solution {
public int[][] modifiedGraphEdges(int n, int[][] edges, int source, int destination, int target) {
Map<Integer, Integer>[] adjs = new Map[n];
for (int i = 0; i < n; i++) {
adjs[i] = new HashMap<>();
}
for (int[] edge : edges) {
adjs[edge[0]].put(edge[1], edge[2]);
adjs[edge[1]].put(edge[0], edge[2]);
}
int[] distTo = new int[n];
Arrays.fill(distTo, Integer.MAX_VALUE);
distTo[source] = 0;
Queue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(i -> i[1]));
pq.add(new int[] {source, 0});
dijkstra(adjs, distTo, pq);
if (distTo[destination] == target) {
return fill(edges);
} else if (distTo[destination] < target) {
return new int[0][0];
} else {
for (int[] edge : edges) {
if (edge[2] == -1) {
edge[2] = 1;
adjs[edge[0]].put(edge[1], 1);
adjs[edge[1]].put(edge[0], 1);
pq.clear();
pq.add(new int[] {edge[0], distTo[edge[0]]});
pq.add(new int[] {edge[1], distTo[edge[1]]});
dijkstra(adjs, distTo, pq);
if (distTo[destination] == target) {
return fill(edges);
} else if (distTo[destination] < target) {
edge[2] += target - distTo[destination];
adjs[edge[0]].put(edge[1], edge[2]);
adjs[edge[1]].put(edge[0], edge[2]);
return fill(edges);
}
}
}
}
return new int[0][0];
}
private int[][] fill(int[][] edges) {
for (int[] edge : edges) {
if (edge[2] == -1) {
edge[2] = (int) (2 * 1e9);
}
}
return edges;
}
private void dijkstra(Map<Integer, Integer>[] adjs, int[] distTo, Queue<int[]> pq) {
while (!pq.isEmpty()) {
int[] curr = pq.poll();
for (Map.Entry<Integer, Integer> entry : adjs[curr[0]].entrySet()) {
if (entry.getValue() > 0) {
int next = entry.getKey();
if (distTo[next] - entry.getValue() > distTo[curr[0]]) {
distTo[next] = distTo[curr[0]] + entry.getValue();
pq.add(new int[] {next, distTo[next]});
}
}
}
}
}
}
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).