如果在给定有向图的顶点v和t之间存在NON-SIMPLE路径,我正在寻找可以告诉(返回true或false)的最简单算法。
我不介意使用BFS,DFS,Dijkstra或任何其他可以帮助解决这个问题的算法,我试图获得SCC图,但我找不到任何好的用途。
任何帮助将不胜感激!
谢谢!
答案 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'中的每个顶点,保留两件事:
现在,如果存在来自顶点'顶点的路径,则以下函数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无法到达的顶点,寻找一个循环。如果找到这样的循环,则报告存在非简单路径。