2015-04-12 47 views
0

我输入的HashMap如何找到从源节点Java代码

static HashMap<Integer, List<Integer> > map = new HashMap<Integer, List<Integer>>(); 

基本输入是这样的所有路径:

1 :: [2, 11] , 2 :: [1, 3] , 3 :: [2, 11, 5] , 4 :: [11, 12] , 5 :: [6, 7, 3] , 6 :: [5, 7] , 7 :: [5, 6] , 8 :: [12, 10] , 9 :: [12, 10] , 10 :: [8, 9] , 11 :: [1, 3, 4] , 12 :: [4, 8, 9] 

1这都说明,我可以去2或11 ,从2到1或3 ...

我需要找到节点的最大长度,我们可以从1开始...

+0

好问题kamesh –

+0

答案是:无限。你可以从1到2,然后从2到1,然后从1到2,然后从2到1无限。说真的,如果你想要一个更有建设性的答案,你需要明确地定义你的问题,并展示你所尝试过的。我们不会做你的功课。 –

+0

JB Nizet:一旦你访问它,你不能去节点.. – kamesh

回答

0

最后我编写了一个程序来解决这个问题。我假设没有无限循环。

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.HashSet; 
import java.util.List; 

class Kavi { 

    static HashMap<Integer, List<Integer> > map = new HashMap<Integer, List<Integer>>(); 

    static HashMap<Integer, HashSet<Integer> > nodeValuesMap=new HashMap<Integer, HashSet<Integer>>(); 

    static HashMap<Integer, HashSet<Integer> > allPossibleTraversedNodes=new HashMap<Integer, HashSet<Integer>>(); 


    static HashMap<Integer, List<Integer> > putVal() 
    { 
     ArrayList<Integer> list; 
     list=new ArrayList<Integer>(); 
     list.add(2); list.add(4); 
     map.put(1, list); 

     list=new ArrayList<Integer>(); 
     list.add(3);list.add(5); list.add(6); 
     map.put(2, list); 

     list=new ArrayList<Integer>(); 
     list.add(6); 
     map.put(3, list); 

     list=new ArrayList<Integer>(); 
     list.add(3);list.add(5); list.add(6); 
     map.put(4, list); 

     list=new ArrayList<Integer>(); 
     list.add(6); 
     map.put(5, list); 
     return map; 
    } 


    public static void recurs(int node) 
    { 
      ArrayList<Integer> list=(ArrayList<Integer>) map.get(node); 
        if(list==null) 
         return; 

      if(nodeValuesMap.get(node)==null) 
      { 
       HashSet<Integer> nodeSet=new HashSet<Integer>(); 
       nodeSet.addAll(list); 
       nodeValuesMap.put(node,nodeSet); 
        for(Integer i:nodeSet) 
        recurs(i); 
      } 

      else 
      { 
       HashSet<Integer> nodeSet=nodeValuesMap.get(node); 
       nodeSet.add(node); 
       nodeValuesMap.put(node, nodeSet); 

      } 

    } 



    public static void main(String[] 
      args){ 

     putVal(); 
     for(int i=1;i<=map.size();i++) 
     { 
      recurs(i); 

      HashSet<Integer> tempNodeSet=new HashSet<Integer>(); 
      for(int j=1;j<=map.size();j++) 
      { 
       if(null!=nodeValuesMap.get(j)) 
        tempNodeSet.addAll(nodeValuesMap.get(j)); 
      } 
      allPossibleTraversedNodes.put(i,tempNodeSet); 
      nodeValuesMap.clear(); 
     } 

     for(int i=1;i<=allPossibleTraversedNodes.size();i++) 
     { 
      HashSet<Integer> nodeSet=(HashSet<Integer>) allPossibleTraversedNodes.get(i); 
      System.out.println("Base Node := "+i +" All Possible Traversed Nodes:= "); 
      for(Integer node:nodeSet) 
       System.out.print(node+" , "); 
      System.out.println("\n--------------------------------"); 
     } 

    } 
} 
+1

这给出了您可以从某个节点到达的节点总数,而OP似乎要求您可以从某个节点穿过的最长路径的长度。 – Aerus

+0

如果您想要查找最大节点值或最大节点数,而不是迭代HashSet。它有可能的节点的完整列表 –

+0

我的意思是,在你的例子中,从1开始的解决方案是:'2,3,4,5,6',这样就是长度为5.但是从3到4没有边缘。我认为正确答案(从1开始)是:'2,3,6'或'2,5,6'或'4,3,6''等全部长度为3. – Aerus