Search code examples
javadata-structuresgraphdepth-first-searchconnected-components

Why this code is not working on hackerrank?


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);
               }
           }
       }
   }




  }

Solution

  • 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.