我正在寻找一种有效的方法来查找可以从JUNG中的特定节点集合访问的所有节点的集合。我不知道该怎么做。一种解决方案是获取特定集合的每个节点的邻居并执行该操作直到没有添加关于该过程的新节点。但我认为可能会有更有效的方式。你能告诉我它会是什么吗? (以下是我的实施代码)
private HashSet<Customer> getReachableNodes(Collection<Customer> churners, DirectedSparseGraph<Customer, Transaction> net) {
HashSet<Customer> reachableNode = new HashSet<Customer>();
for (Customer churner : churners) {
for(Customer neighbor:net.getVertices()){
if(isNeighbor(neighbor,churners,net)) reachableNode.add(neighbor)
}
}
return reachableNode ;
}
答案 0 :(得分:1)
一种简单的方法可能是进行简单的广度优先遍历(http://en.wikipedia.org/wiki/Breadth-first_search),但是使用一组“起始节点”而不是单个:
private static <V> Set<V> findReachable(
Collection<? extends V> startNodes, Graph<V, ?> graph)
{
Queue<V> queue = new LinkedList<V>();
Set<V> visited = new LinkedHashSet<V>();
queue.addAll(startNodes);
visited.addAll(startNodes);
while(!queue.isEmpty())
{
V v = queue.poll();
Collection<V> neighbors = graph.getNeighbors(v);
for (V n : neighbors)
{
if (!visited.contains(n))
{
queue.offer(n);
visited.add(n);
}
}
}
return visited;
}