确定JUNG图中两个节点是否通过多条路径连接的快速方法?

时间:2013-04-05 14:02:17

标签: java graph-theory jung

从定向JUNG图中给出两个节点AB,我想确定从AB是否有多条路径(不一定是最短路径。)

我只能想到两种方法,非常耗费时间。

  1. 检索连接两个节点的所有路径(问题Finding all paths in JUNG?)并检查是否有多个路径。

  2. 使用该类检索最短路径 DijkstraShortestPath,然后打破这条路径并搜索 最短的路径。如果还有一个,则意味着有 多条路径。 请注意,这也需要克隆图形,因为我不想更改原始图形。

  3. 我怎样才能更聪明地做到这一点(即更快)?

1 个答案:

答案 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; 
    }