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