Java Graphs和Deep-First-Search

时间:2014-04-22 17:26:15

标签: java graph

我正在尝试完成一项提示,其提示如下:

  

这是2059年。你今年5月有空闲时间,想参观一个有趣的星系。在旅途中你需要一些机器,你想知道它们中有多少可以拿走。   商店里有很多机器。每台机器可能需要一些其他机器才能正常工作,并且您希望所有机器都能正常工作。幸运的是,在2053年,我们引入了一项特殊规则,让客户的生活更轻松。规则说如果机器A依赖于另一台机器B,那么机器B也依赖于机器A.

     

您想要购买K台不同的机器,以便所有机器都能正常工作。您将获得一个描述机器之间依赖关系的String []依赖项。依赖关系的元素i是机器i依赖的空间分隔的机器列表。以升序返回包含K的所有可能正值的int []。

     

示例:

     

{“1 2”,“0”,“0”,“”}

     

机器0需要机器1和2才能工作   机器1需要机器0才能工作   机器2需要机器0才能工作   机器3不需要任何其他机器工作
  允许的K值为1(您只需要机器3),3(您需要机器0,1,2)和4(您可以使用所有机器)。所以你应该回来     {1,3,4}

我到目前为止的代码没有通过任何测试用例,但我无法理解为什么。

public class GalaxyTrip {

    Set<String> myVisited= new TreeSet<String>();
    TreeMap<String, List<String>> myGraph = new TreeMap<String, List<String>>();

    public int[] possibleValues(String[] dependencies) {
        int vertex = 0;
        for(String s : dependencies)
        {
            String sv = "" + vertex;
            vertex++;

            List<String> list = new ArrayList<String>();

            if (s.equals("")) continue;           // no vertices, don't parse
            String[] a = s.split(" ");

            for (String nextv : a)
            {
                list.add(nextv);
            }

            myGraph.put(sv, list);
      }
      ArrayList<Integer> myAnswers= new ArrayList<Integer>();
      for(String thing:myGraph.keySet()){
          int answer=dfs(thing);
          myAnswers.add(answer);
      }
      int[] intArray = new int[myAnswers.size()];  
      for (int i = 0; i < myAnswers.size(); i++) {  
          intArray[i] = myAnswers.get(i);  
      }  
      Arrays.sort(intArray);
      return intArray;
 }
 private int dfs(String vertex){
     if(myVisited.contains(vertex)){
         return 0;
     }
     myVisited.add(vertex);
     int total=1;
     for(String adj:myGraph.get(vertex)){
         total+=dfs(adj);
     }
     return total;
 }

1 个答案:

答案 0 :(得分:-1)

在返回的集合中值为0是否可以接受?查看代码,对于大小为n的图形,无论其配置如何,我都希望intArray的大小为n。此外,如果你有一个5号组件和4号组件,我希望根据你的解决方案看到以下结果:

{0,0,0,0,0,0,0,0,0,0,4,4,5}

请注意,您缺少值8,9和13,因为您从不将任何结果添加到一起。在我看来,你正确处理dfs并跟踪你是否看到了一个顶点。似乎缺少的是在答案中处理重复的结果(在这种情况下有很多0,有4个用于4),以及计算所有可能的求和子集的缺失步骤。

提示:使用Set存储myAnswers而不是List,并抛出任何值为0的答案。然后,处理添加过程。