[英]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.