Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确定JUNG图中两个节点是否通过多条路径连接的快速方法?_Java_Graph Theory_Jung - Fatal编程技术网

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

Java 确定JUNG图中两个节点是否通过多条路径连接的快速方法?,java,graph-theory,jung,Java,Graph Theory,Jung,给定一个有向JUNG图中的两个节点A和B,我想确定从A到B是否有多条路径(无需依赖最短路径) 我只能想到两种方法,都非常耗时 检索连接两个节点的所有路径(问题),并检查是否有多个路径 使用类检索最短路径 DijkstraShortestPath,然后断开此路径并搜索 又是最短路径。如果还有一个,那就意味着有 多路径。 请注意,这还需要克隆图形,因为我不想更改原始图形 我如何才能更聪明(即更快)地完成这项工作?我自己找到了一个解决方案 我的问题还有一个额外的限制,即我只想检查与和边直接连接的两个节

给定一个有向JUNG图中的两个节点
A
B
,我想确定从
A
B
是否有多条路径(无需依赖最短路径)

我只能想到两种方法,都非常耗时

  • 检索连接两个节点的所有路径(问题),并检查是否有多个路径

  • 使用类检索最短路径
    DijkstraShortestPath
    ,然后断开此路径并搜索 又是最短路径。如果还有一个,那就意味着有 多路径。 请注意,这还需要克隆图形,因为我不想更改原始图形


  • 我如何才能更聪明(即更快)地完成这项工作?

    我自己找到了一个解决方案

    我的问题还有一个额外的限制,即我只想检查与和边直接连接的两个节点是否只有一条以上的路径。这意味着,通过简单地计算最短路径,您将始终获得此单条边作为路径

    因此,我的问题可以重新表述为:

    除了边本身之外,还有其他路径连接边的两个节点吗?

    解决方案是使用加权最短路径。如果我们将非常高的权重分配给感兴趣的边缘,将权重
    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; 
        }
    
    public静态布尔AreThere多重路径(最终边,DirectedGraph图形){
    变压器=新变压器(){
    公共整数变换(边otherEdge){
    如果(其他边等于(边))
    返回Integer.MAX_值;
    其他的
    返回1;
    }
    };
    DijkstraShortestPath算法=新的DijkstraShortestPath(图形、变压器);
    Double distance=(Double)算法.getDistance(edge.getStartNode(),edge.getEndNode());
    返回距离<整数最大值;
    }
    
    您想知道是有多条最短路径,还是只有多条路径?此外,您是否对删除顶点或仅删除边的修改感兴趣?如果您对删除顶点的修改感兴趣,可能会对双组件群集感兴趣:只是多条路径。我不确定修改图形是否是解决此问题的最聪明的方法,但我将尝试使用
    双组件集群
    。然而,我不明白为什么它只接受
    无向图
    。我是否需要克隆整个图形以删除所有边方向?我必须检查,但我敢打赌BiComponentCluster实际上不需要“UndirectedGraph”约束。尝试修改它,使它需要一个图形,看看它是否工作;这应该是一个简单的更改。现在我想起来了,这个类只接受
    无向图
    ,这实际上是有道理的。即使我设法传递了一个
    DirectedGraph
    ,边缘方向也会被忽略,因此我无法使用此类来检测定向路径。我说得对吗?这种约束使一切都不同了;希望你以前提到过。在这种情况下,您有一个更优雅的解决方案:删除边,运行Dijkstra,然后查看是否存在非空距离。您是对的,我后来才意识到我有额外的约束。无论如何,在我的问题中,我已经说过这种优雅的解决方案是不可能的,因为我不想改变图表。唯一的方法是克隆图形,但我想这会使解决方案比我的更耗时。为什么更改图形如此重要?当您运行此计算时,是否有其他读者正在查看图表?(你可以在没有副作用的情况下放回边缘。)副注:“距离”可以为空,这样你就可以在你编写的代码的最后一行抛出NPE。如果我可以放回边缘而没有副作用,那么这个解决方案也是一个很好的选择。感谢您指出。JUNG本身没有与删除边缘相关的副作用。