为什么这段代码不适用于hackerrank?

时间:2017-03-02 20:27:11

标签: java data-structures graph depth-first-search connected-components

我正在解决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);
               }
           }
       }
   }




  }

1 个答案:

答案 0 :(得分:3)

我已完成了几个程序的测试运行。

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

3 1
0 2

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

(我已编辑此段。)似乎如果所有对都A等于B,您将获得ArrayIndexOutOfBoundsException。例如:

1 1
0 0

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

正如我在评论中所说,我并没有深入研究你的程序,以了解它为何如我所描述的那样行事;我只是观察并向你汇报。我将把调试留给自己。