I am solving a problem on Hackerrank,you can read that on-https://www.hackerrank.com/challenges/journey-to-the-moon
Output is not correct using following code
I have implemented all required data structures in that code and tried to create array of sizes of connected components.
import java.io.*;
import java.util.*;
public class Solution {
public static void main(String[] args) throws Exception{
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
String[] temp = bfr.readLine().split(" ");
int N = Integer.parseInt(temp[0]);
int I = Integer.parseInt(temp[1]);
Solution sol=new Solution();
Graph g = sol.new Graph(N);
for(int i = 0; i < I; i++){
temp = bfr.readLine().split(" ");
int a = Integer.parseInt(temp[0]);
int b = Integer.parseInt(temp[1]);
g.addEdge(a,b);
// Store a and b in an appropriate data structure of your choice
}
CC ccg=sol.new CC(g);
int len=ccg.getComp();
long combinations = 0;
for(int k=0;k<len;k++){
if(k==0){
combinations+=ccg.getNum(k);
}else{
combinations*=ccg.getNum(k);
}
}
// Compute the final answer - the number of combinations
System.out.println(combinations);
}
class Graph{
final int s;
Bag[] adj;
public Graph(int si){
s=si;
adj=new Bag[s];
for(int i=0;i<si;i++){
adj[i]=new Bag();
}
}
public void addEdge(int i,int j){
adj[i].add(j);
adj[j].add(i);
}
public int graphSize(){
return s;
}
public Iterable<Integer> adj(int v){
return adj[v];
}
}
class Bag implements Iterable<Integer>{
Node first;
int size=0;
final class Node{
int i;
Node next;
}
public void add(int x){
Node old=first;
first=new Node();
first.i=x;
first.next=old;
size++;
}
public int getSize(){
return size;
}
public Iterator<Integer> iterator() {
// TODO Auto-generated method stub
return new ListIterator();
}
public class ListIterator implements Iterator<Integer>{
private Node current=first;
public boolean hasNext(){
return current!=null;
}
public void remove(){}
public Integer next(){
int i=current.i;
current=current.next;
return i;
}
}
}
class CC{
private boolean[] marked;
private int[] id;
private int[] comp;
private int count=0;
public CC(Graph g){
int i=g.graphSize();
marked=new boolean[i];
id=new int[i];
comp=new int[i];
for(int j=0;j<i;j++){
comp[j]=0;
}
for(int v=0;v<i;v++){
if(!marked[v]){
dfs(g,v);
count++;
}
comp[count]=comp[count]+1;
}
}
public int getComp(){
return count;
}
public int getNum(int i){
return comp[i];
}
private void dfs(Graph g,int v){
marked[v]=true;
id[v]=count;
for(int w:g.adj[v]){
if(!marked[w]){
dfs(g,w);
}
}
}
}
}
I have done a couple of test runs of your program.
In all runs your program printed 0. While 0 is the correct output in some cases, it wasn’t the correct output in all my cases. So this could be one reason for Hackerrank turning your program down. Example input:
3 1
0 2
I meant this to describe 2 nations with astronauts 0 and 2 coming from one nation and astronaut 1 from the other nations.
Expected output: 2
. Actual output from your program: 0
.
(I have edited this paragraph.) It seems that if all pairs have A
equal to B
, you will get an ArrayIndexOutOfBoundsException
. For example:
1 1
0 0
I see nothing in the Hackerrank rules forbidding A == B
, so I suppose you should take it into account.
As I said in a comment, I am not digging into your program to understand why it behaved as I have described; I have only been observing and reporting back to you. I will leave the debugging to yourself.