要查找有向图中每对顶点之间是否存在路径,我正在检查是否可以使用DFS从特定顶点访问所有顶点。问题是我必须做V DFS,其中V是顶点的数量。 (V最高可达10 ^ 5)。有没有更有效的方法来做到这一点?一些伪代码或实现将是值得赞赏的。
考虑这个图:(1 - > 3),(2 - > 3),(3 - > 1)
从1到2没有路径,但是从2到1(2 - > 3 - > 1)的路径。所以这意味着即使没有路径(v - > u),每对顶点(u - > v)都有一条路径。
答案 0 :(得分:2)
查看Tarjan的强连接组件算法。如果只存在一个强连通分量,则意味着每对顶点之间存在一条路径。
要弄清楚这一点,请对图形进行拓扑排序,然后以反向伪拓扑顺序遍历它。如果您不需要重启'遍历这意味着,这意味着每个可能的顶点之间都存在一条路径。
答案 1 :(得分:1)
要查找是否有单个路径访问有向图的所有顶点(可以多次访问顶点和边),那么:
<强>实施例强>:
如果图形的格式为:
,则将SCC缩减为伪顶点(1) -> (2) -> ... (n-1) -> (n)
然后有一条路径可以访问所有顶点。
如果是以下形式:
(1_a) --\
+--> (2) -> ... (n-1) -> (n)
(1_b) --/
然后无法从(1_a)
到达顶点(1_b)
,反之亦然,因此没有可以到达所有顶点的路径。
类似地:
/-> (n_a)
(1) -> (2) -> ... -+
\-> n_b
然后无法从(n_a)
到达顶点(n_b)
,反之亦然,因此没有可以到达所有顶点的路径。
最后,如果是形式:
/-> (x_a) -\
(1) -> (2) -> ... -+ +-> ... (n-1) -> (n)
\-> (x_b) -/
然后没有可以同时到达(x_a)
和(x_b)
的路径。
答案 2 :(得分:0)
我不知道为什么有些答案看起来如此不必要地复杂。实际上,您可以仅使用图的拓扑排序,并检查是否存在连接每个节点及其后续节点的边。