Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何利用集合和队列求图的可达性_Java_Graph_Queue_Set - Fatal编程技术网

Java 如何利用集合和队列求图的可达性

Java 如何利用集合和队列求图的可达性,java,graph,queue,set,Java,Graph,Queue,Set,我在查找可从给定节点访问的所有节点时遇到一些问题。除非使用DFS或BFS,否则我将尝试使用集合和队列来生成所有可访问的节点。据我所知,我可以将队列初始化为开始节点,然后将开始节点添加到集合中,并将其从队列中删除。如果成功将其添加到集合中(不是重复的),则将其可到达的节点添加回队列中。重复此操作,直到队列为空,然后返回集合 public static Set<String> reachable (Map<String, Set<String>> graph, S

我在查找可从给定节点访问的所有节点时遇到一些问题。除非使用DFS或BFS,否则我将尝试使用集合和队列来生成所有可访问的节点。据我所知,我可以将队列初始化为开始节点,然后将开始节点添加到集合中,并将其从队列中删除。如果成功将其添加到集合中(不是重复的),则将其可到达的节点添加回队列中。重复此操作,直到队列为空,然后返回集合

public static Set<String> reachable (Map<String, Set<String>> graph, String startNode) {
         //Set of nodes accessible from the startNode
         Set<String> reachableNodes = new ArraySet<String>();

         //Queue of accessible nodes from a given node to search from.
         Queue<String> searchNodes = new ArrayQueue<String>(graph.get(startNode));

         //Stuck here.

         return reachableNodes;
}

一般来说,您描述的算法是BFS。您可以使用“卡住”部分中的while循环来执行此操作:


你能解释一下你的算法吗?它看起来类似于BFShow在您的案例中是否处理NoSuchElementException?@nitiger如果您发现一个节点在图中没有条目,它将使用
containsKey
子句跳过If。我认为这段代码不会有任何异常。它为ArrayQueue.peek:empty queue抛出了一个NoSuchElementException。我找不到ArrayQueue类的文档,但是javadocs显示peek在空队列上返回null:无论哪种方式,当您得到该异常时,您都完成了,因此您可以捕获它并在从该方法返回之前安全地将其丢弃。
{ c : [f,e] ,
  f : [g,d] ,
  e : [d]   ,
  d : [g]   }

"Enter startNode: c"
add f,e -> queue
remove f from queue
add f to set
add g d to queue
remove e
add e to set 
add d to queue   
loop until queue is empty.
while (searchNodes.peek() != null) {
    String next = searchNodes.remove();
    boolean isNewNode = reachableNodes.add(next);
    if (isNewNode && graph.containsKey(next)) {
        for (String node : graph.get(next)) {
            searchNodes.add(node);
        }
    }
}