从定向JUNG图中给出两个节点A
和B
,我想确定从A
到B
是否有多条路径(不一定是最短路径。)
我只能想到两种方法,非常耗费时间。
检索连接两个节点的所有路径(问题Finding all paths in JUNG?)并检查是否有多个路径。
使用该类检索最短路径
DijkstraShortestPath
,然后打破这条路径并搜索
最短的路径。如果还有一个,则意味着有
多条路径。
请注意,这也需要克隆图形,因为我不想更改原始图形。
我怎样才能更聪明地做到这一点(即更快)?
答案 0 :(得分:0)
我自己找到了解决方案。
我的问题还有一个额外的限制,我只想检查是否只有两个与直接连接的节点有的路径。这意味着通过简单地计算最短路径,您将始终将此单边作为路径。
所以,我的问题可以重新表述为:
是否有另一条路径连接边缘的两个节点,除了边缘本身?
解决方案是使用加权最短路径。如果我们为我们感兴趣的边缘分配一个非常高的权重,并且对所有其他边缘分配权重1
,那么如果最小距离低于我们的高权重,则答案是是,否则否强>
以下是代码:
public static boolean areThereMultiplePaths(final Edge edge, DirectedGraph<Entity, Edge> graph) {
Transformer<Edge, Integer> transformer = new Transformer<Edge, Integer>() {
public Integer transform(Edge otherEdge) {
if (otherEdge.equals(edge))
return Integer.MAX_VALUE;
else
return 1;
}
};
DijkstraShortestPath<Entity, Edge> algorithm = new DijkstraShortestPath<Entity, Edge>(graph, transformer);
Double distance = (Double) algorithm.getDistance(edge.getStartNode(), edge.getEndNode());
return distance < Integer.MAX_VALUE;
}