[英]Fast way of determining whether two nodes in a JUNG graph are connected by more than one path?
给定有向JUNG图中的两个节点A
和B
,我想确定从A
到B
是否有一条以上的路径(不一定是最短的路径)。
我只能想到两种方法,两者都很费时。
检索连接两个节点的所有路径 (问题是否在JUNG中找到所有路径? ),然后检查是否有多个路径 。
通过使用类DijkstraShortestPath
检索最短路径,然后断开该路径并再次搜索最短路径。 如果还有一条,则意味着存在多条路径。 请注意,这也需要克隆图,因为我不想更改原始图。
我如何才能更智能(即更快 )?
我自己找到了解决方案。
我的问题还有一个额外的约束,即我只想检查是否只有两个直接与and edge连接的节点有一条以上的路径。 这意味着通过简单地计算最短路径,您将始终获得这条单边作为路径。
因此,我的问题可以改写为:
除了边缘本身之外,是否还有另一条路径连接边缘的两个节点?
解决方案是使用加权的最短路径。 如果我们给感兴趣的边缘分配了非常高的权重,而给所有其他权重分配了权重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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.