Source : https://www.hackerrank.com/challenges/ctci-bfs-shortest-reach
Consider an undirected graph consisting of nodes where each node is labeled from to and the edge between any two nodes is always of length . We define node to be the starting position for a BFS. Given a graph, determine the distances from the start node to each of its descendants and return the list in node number order, ascending. If a node is disconnected, it's distance should be .
For example, there are nodes in the graph with a starting node . The list of , and each has a weight of .

Starting from node and creating a list of distances, for nodes through we have .
Function Description
Define a Graph class with the required methods to return a list of distances.
Input Format
The first line contains an integer, , the number of queries.
Each of the following sets of lines is as follows:
- The first line contains two space-separated integers, and , the number of nodes and the number of edges.
- Each of the next lines contains two space-separated integers, and , describing an edge connecting node to node .
- The last line contains a single integer, , the index of the starting node.
Constraints
Output Format
For each of the queries, print a single line of space-separated integers denoting the shortest distances to each of the other nodes from starting position . These distances should be listed sequentially by node number (i.e., ), but should not include node . If some node is unreachable from , print as the distance to that node.
Sample Input
24 21 21 313 12 32Sample Output
6 6 -1-1 6Explanation
We perform the following two queries:
- The given graph can be represented as:
where our start node, , is node . The shortest distances from to the other nodes are one edge to node , one edge to node , and there is no connection to node . - The given graph can be represented as:
where our start node, , is node . There is only one edge here, so node is unreachable from node and node has one edge connecting it to node . We then print node 's distance to nodes and (respectively) as a single line of space-separated integers: -1 6.
Note: Recall that the actual length of each edge is , and we print as the distance to any node that's unreachable from .
Source : https://www.hackerrank.com/challenges/ctci-bfs-shortest-reach
Solution
| // Karthikalapati.blogspot.com | |
| import java.util.Scanner; | |
| import java.util.HashSet; | |
| import java.util.ArrayDeque; | |
| public class Solution { | |
| private static final int EDGE_WEIGHT = 6; | |
| public static void main(String[] args) { | |
| Scanner scan = new Scanner(System.in); | |
| int numQueries = scan.nextInt(); | |
| for (int q = 0; q < numQueries; q++) { | |
| int numNodes = scan.nextInt(); | |
| int numEdges = scan.nextInt(); | |
| /* Create Nodes */ | |
| Node [] node = new Node[numNodes + 1]; // node "i" will be at index "i" | |
| node[0] = null; | |
| for (int i = 1; i <= numNodes; i++) { | |
| node[i] = new Node(i); | |
| } | |
| /* Connect Nodes */ | |
| for (int i = 0; i < numEdges; i++) { | |
| int n1 = scan.nextInt(); | |
| int n2 = scan.nextInt(); | |
| node[n1].addNeighbor(node[n2]); | |
| } | |
| /* Create MST */ | |
| int start = scan.nextInt(); | |
| findDistances(node[start]); | |
| /* Print results */ | |
| for (int i = 1; i <= numNodes; i++) { | |
| if (i != start) { | |
| System.out.print(node[i].distance + " "); | |
| } | |
| } | |
| System.out.println(); | |
| } | |
| scan.close(); | |
| } | |
| /* Uses BFS to find minimum distance of each Node from "start". | |
| Can use BFS instead of Dijkstra's Algorithm since edges are equally weighted. */ | |
| private static void findDistances(Node start) { | |
| if (start == null) { | |
| return; | |
| } | |
| ArrayDeque<Node> deque = new ArrayDeque(); // use deque as a queue | |
| start.distance = 0; | |
| deque.add(start); | |
| while (!deque.isEmpty()) { | |
| Node curr = deque.remove(); | |
| for (Node neighbor : curr.neighbors) { | |
| if (neighbor.distance == -1) { // meaning it's unvisited | |
| neighbor.distance = curr.distance + EDGE_WEIGHT; | |
| deque.add(neighbor); | |
| } | |
| } | |
| } | |
| } | |
| /* Implementation of an UNDIRECTED graph */ | |
| public static class Node { | |
| public final int id; // each Node will have a unique ID | |
| public int distance; // Also tells us if Node has been visited (-1 means unvisited) | |
| public HashSet<Node> neighbors; | |
| public Node (int id) { | |
| this.id = id; | |
| distance = -1; | |
| neighbors = new HashSet(); | |
| } | |
| public void addNeighbor(Node neighbor) { | |
| neighbors.add(neighbor); | |
| neighbor.neighbors.add(this); | |
| } | |
| @Override | |
| public boolean equals(Object other) { | |
| if (other == this) { | |
| return true; | |
| } else if (other == null || !(other instanceof Node)) { | |
| return false; | |
| } | |
| Node otherNode = (Node) other; | |
| return this.id == otherNode.id; | |
| } | |
| @Override | |
| public int hashCode() { | |
| return id; // simple and effective | |
| } | |
| } | |
| } |
No comments:
Post a Comment