判断顶点 u 到 w 是否有路径经过 v

-22 algorithm flow graph path ford-fulkerson

鉴于无向图G = (V, E),使得uvw在G.一些边

描述一个算法来确定是否

“如果有一条从 u 到 w 的路径通过 v”

下面给出了使用 DFS 的简单算法:

bool checkFunction(){

  graph g; // containing u, w, v
  dfs(v);

  if(isVisited(u) && isVisited(w))
    return true;
  else
    return false;
   
}
Run Code Online (Sandbox Code Playgroud)

对于上述算法,

  • 时间复杂度:O(V+E)
  • 空间复杂度:O(V)

但是我们可以降低时间复杂度吗?

hel*_*ion 14

注意:这篇文章没有提供所发布问题的解决方案,但它确实提供了一些有关解决此类问题时可能犯的常见错误的信息。

(这篇文章还假定路径,不允许重复顶点。如果删除此约束,这个问题可以很容易地从u寻找到v的路径解决,从v到w和刚刚串联这两个路径获得的路径从 u 到 w 通过 v。这可以通过从 u 运行一次 BFS 和从 v 运行一次来​​实现)

amit 给出答案是不正确的。


编辑:
下面的反例不正确,请参阅史蒂夫的评论。在这之后,我提供了另一个反例。
考虑一个反例。
V = {u, v, w, x}
E = {{u,v}, {u,w}, {u,x}, {v,x}, {w,x}}
那么,路径(u ,v,x,w) 是有效路径。
现在假设我们在 w 上应用 BFS,我们从 w 到 u 和 w 到 v 的相应路径(不是唯一的)将是 (w,u) 和 (w, u, v)
现在,“路径” (v, u,w,u) 有一个重复的节点 u,所以它不是一条路径。


另一个反例:
考虑 V = {u,v,w,x,y,z} E = {{u,x}, {v,x}, {x,w}, {v,y}, {y, z}, {z,w}}
来自 w 的 BFS 树将具有 {{w,x}, {w,z}, {x,u}, {x,v}}(我们将 u,v 视为sinks)
这给出了无效的“路径”{u,x,w,x,v}

马特回答也是不正确的。

当 u、v 和 w 在同一个连通分量中时,路径存在。

考虑一个线图 {w, u, v},那么这 3 个都位于同一个连通分量中,但是没有从 u 到 w 的路径通过 v


这个问题(对于无向图)也在这里说明(见问题 7),我认为这是一个有信誉的来源,所以我们可以安全地假设确实存在一个有效的算法。
也论证了解决方案的存在,并提供了一个算法。
对于有向图,这是一个“困难”的问题

  • 取消删除它是因为 (A) 它可能包含有用的信息,并且 (B) 目前正在 Meta 上讨论它,当答案已经被修改删除时,讨论删除答案是不合理的。如果您对为什么应该或不应该删除这个答案有意见,请在 Scratte 链接的元问题上发帖(不要​​在此处发表评论)。谢谢你! (31认同)
  • 请注意,这个答案正在元上讨论[Is an answer that say that other questions not an answer?](https://meta.stackoverflow.com/questions/403026/is-an-answer-that-说其他答案是错误的,不是答案)。如果您有问题的解决方案,如果您将其添加到此处的答案中,那将会非常有帮助:) (18认同)
  • 线图 {v, u, w} 中,有一条经过 v 的路径 [u,v,u,w]。不要求路径必须简单。另外,如果你想说我的答案是错误的,你真的应该评论一下。 (3认同)
  • 由于某种原因,您假设具有重复节点的路径“不是路径”。是的,它不是一条*简单的*路径——但它是一条路径。该问题并不要求简单的路径。因此,您提供的反例不成立。 (3认同)