为什么此代码不适用于 hackerrank?

Why this code is not working on hackerrank?

我正在 Hackerrank 上解决一个问题,你可以在-https://www.hackerrank.com/challenges/journey-to-the-moon

上阅读

使用以下代码输出不正确

我已经在该代码中实现了所有必需的数据结构,并尝试创建连接组件大小的数组。

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




  }

我已经对你的程序进行了几次测试。

在所有运行中,您的程序都打印了 0。虽然 0 在某些情况下是正确的输出,但在我的所有情况下都不是正确的输出。所以这可能是 Hackerrank 拒绝您的程序的原因之一。输入示例:

3 1
0 2

我的意思是描述 2 个国家,宇航员 0 和 2 来自一个国家,宇航员 1 来自其他国家。 预期输出:2。程序的实际输出:0.

(我已经编辑了这一段。)似乎如果所有对的 A 等于 B,你将得到一个 ArrayIndexOutOfBoundsException。例如:

1 1
0 0

我在 Hackerrank 规则中没有看到任何禁止 A == B,所以我想你应该考虑一下。

正如我在评论中所说,我并不是要深入研究您的程序以了解其行为为何如我所描述的那样;我只是在观察并向您报告。我会把调试留给你自己。