static class Node {
int index;
int cost;
public Node(int index, int cost) {
this.index = index;
this.cost = cost;
}
}
// Complete the shortestReach function below.
static int[] shortestReach(int n, int[][] edges, int s) {
// construct returning datasture;
int[] dist = new int[n];
for (int i = 0; i<n; i++) {
dist[i] = Integer.MAX_VALUE;
}
boolean[] visited = new boolean[n];
PriorityQueue<Node> pq = new PriorityQueue<>(new Comparator<Node>() {
@Override
public int compare(Node n1, Node n2) {
return n1.cost - n2.cost;
}
});
List<List<Node>> adj = new ArrayList<>();
for (int i = 0; i<n; i++) adj.add(new ArrayList<>());
for (int i = 0; i<edges.length; i++) {
int f = edges[i][0]-1;
int t = edges[i][1]-1;
int cost = edges[i][2];
adj.get(f).add(new Node(t, cost));
adj.get(t).add(new Node(f, cost));
}
pq.offer(new Node(s-1, 0));
int ex = 0;
while (!pq.isEmpty()) {
Node cur = pq.poll();
int curIndex = cur.index;
if (visited[curIndex]) {
continue;
}
if (cur.cost == 0) ex = cur.index;
dist[curIndex] = cur.cost;
visited[curIndex] = true;
List<Node> neighbors = adj.get(curIndex);
for (int i = 0; i < neighbors.size(); i++) {
Node node = neighbors.get(i);
if (visited[node.index]) continue;
if (dist[curIndex] + node.cost < dist[node.index]) {
dist[node.index] = cur.cost+node.cost;
if (!visited[node.index]&&pq.contains(node)) {
pq.remove(node);
pq.offer(new Node(node.index, dist[node.index]));
} else if (!visited[node.index]) {
pq.offer(new Node(node.index, dist[node.index]));
}
}
}
}
int[] re = new int[n-1];
int index = 0;
for (int i = 0; i < dist.length; i++) {
if (i == s - 1) continue;
if (dist[i] == Integer.MAX_VALUE) {
re[index] = -1;
} else {
re[index] = dist[i];
}
index++;
}
return re;
}