查找有向图上是否存在从v到t的非简单路径

时间:2014-04-28 15:18:26

标签: algorithm graph computer-science graph-algorithm depth-first-search

如果在给定有向图的顶点v和t之间存在NON-SIMPLE路径,我正在寻找可以告诉(返回true或false)的最简单算法。

我不介意使用BFS,DFS,Dijkstra或任何其他可以帮助解决这个问题的算法,我试图获得SCC图,但我找不到任何好的用途。

任何帮助将不胜感激!

谢谢!

2 个答案:

答案 0 :(得分:3)

Step 0:如果从v到t没有路径,则答案为否。

Step 1:制作图G'折叠G的所有强连接组件后。

Step 2:如果顶点' v'是一个SCC的一部分,由一个以上的顶点组成,那么肯定存在一个非简单的路径。同样,如果顶点' t'是一个SCC的一部分,由一个以上的顶点组成,然后答案是YES。

Step 3:如果step2不成立。然后确定图G中是否存在从v到t的任何路径。通过折叠成2个或更多顶点的强连通分量的顶点。如果是,那么答案是肯定的,否则答案是否定的。

运行时间:对于上述算法中的每个步骤,O(M + N)。因此整体O(M+N)

编辑:关于如何在线性时间内执行第3步:

对于G'中的每个顶点,保留两件事:

  1. 该顶点的大小。 (与此SCC顶点签订的G的顶点数)
  2. 这个顶点是否可以从t到达。 (我们可以通过在G')
  3. 的反向图上运行dfs来计算

    现在,如果存在来自顶点'顶点的路径,则以下函数throughSCC(int vertex)将返回true。在G'通过任何大小为> = 2的SCC顶点的顶点t。该函数的伪代码:

    boolean throughSCC(int vertex){
        if(!reachable[vertex]){
            return false;
        }
        if(sz[vertex] >= 2){
            return true;
        }
        for(all neighbours X of vertex){
             if(throughSCC(X)){
                  return true;
             }
        }
        return false;
    }
    

答案 1 :(得分:0)

由于SCC算法有点烦人,这里有一个替代算法。遍历一次以确定哪些顶点可从v到达。从t向后遍历,忽略从v无法到达的顶点,寻找一个循环。如果找到这样的循环,则报告存在非简单路径。