Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static int[] shortestReach(final int n, final int[][] edges, final int s) {
- final Node source = buildGraph(n, edges, s);
- final Map<Integer, Integer> dists = new HashMap<>();
- dists.put(s, 0);
- final Set<Integer> visited = new HashSet<>();
- final Queue<Node> queue = new PriorityQueue<>(Comparator.comparing(v -> dists.getOrDefault(v.val, Integer.MAX_VALUE)));
- queue.add(source);
- while (!queue.isEmpty()) {
- final Node node = queue.poll();
- final int dist = dists.get(node.val);
- visited.add(node.val);
- for (final Map.Entry<Node, Integer> adj: node.adjs.entrySet()) {
- final Node adjNode = adj.getKey();
- final int adjDist = dist + adj.getValue();
- if (!visited.contains(adjNode.val)) {
- dists.put(adjNode.val, adjDist);
- queue.add(adj.getKey());
- }
- }
- }
- return buildResult(dists, s, n);
- }
- private static int[] buildResult(final Map<Integer, Integer> dists, final int s, final int n) {
- final int[] result = new int[n - 1];
- for (int i = 1; i <= n; i++) {
- if (i != s) {
- final int dist = dists.getOrDefault(i, -1);
- if (i < s) {
- result[i - 1] = dist;
- } else {
- result[i - 2] = dist;
- }
- }
- }
- return result;
- }
- private static Node buildGraph(final int n, final int[][] edges, final int s) {
- final Map<Integer, Node> graph = new HashMap<>();
- for (int i = 1; i <= n; i++) {
- graph.put(i, new Node(i));
- }
- for (final int[] edge: edges) {
- final Node node1 = graph.get(edge[0]);
- final Node node2 = graph.get(edge[1]);
- final int len = edge[2];
- node1.adjs.put(node2, len);
- node2.adjs.put(node1, len);
- }
- return graph.get(s);
- }
- private static class Node {
- private final int val;
- private final Map<Node, Integer> adjs = new HashMap<>();
- private Node(final int val) {
- this.val = val;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement