【问题标题】:How to find if there is a simple path from vertex x to vertex y that includes the edge e如何查找是否存在从顶点 x 到顶点 y 的包含边 e 的简单路径
【发布时间】:2022-01-03 21:21:35
【问题描述】:

所以我遇到了这个问题,我希望有人可以帮助我。

给定一个无向图 G = (V, E),2 个顶点 x,y 和一条边 e = (v,u)。

建议一种算法来查找是否存在从 x 到 y 的包含边 e 的简单路径。

所以这里的重点是简单路径而不是常规路径,对于常规路径,使用 BFS 搜索从 x 到 v 的路径和从 u 到 y 的路径是一个简单的问题。

我知道可以使用最大流方法解决问题,但我只是不知道如何构建一个可以在其上实现最大流算法的新图,因此它可以判断是否达到了上述标准或没有,希望得到帮助。

提前致谢。

【问题讨论】:

  • 普通的 BFS 实现是否会发现非简单路径,陷入循环??
  • @clwhisk 您可以删除边 e,并使用 BFS 找到从 x 到 v 的路径和从 u 到 y 的路径,注意 BFS 会找到一个简单的路径,这可以是已证明,我假设您已经在讲座中证明了这一点,因此对于查找常规路径的问题,只需执行上述操作,路径将是 (x -> ... -> v -> u -> ... -> y)

标签: algorithm undirected-graph max-flow


【解决方案1】:

不共享边(独立于边)

您可以在 x 和 y 处使用 +1 个源,在 u 和 v 处使用 -1 个汇来求解最大流量。

删除边 e,并将所有其他边设置为容量 1。

当且仅当您可以在这个新的最大流量问题中找到 2 的流量时,才存在通过边 e 从 x 到 y 的简单路径。

不共享顶点(顶点独立,即简单路径)

将原图中的每个顶点v[i]拆分成两个顶点a[i]和b[i]。

对于原始中v[i] 和v[j] 之间的每个无向边,将有向边b[j] 添加到a[i] 和b[i] 到a[j],容量为1。

还添加一条从a[i] 到b[i] 的有向边,每个顶点v[i] 的容量为1。

这个想法是,流必须始终到达a[i] 顶点,并在通过从a[i] 到b[i] 的容量1 瓶颈后从b[i] 顶点离开。这样可以确保每个顶点只能使用一次。

使用这个新图,继续处理与边无关的情况。

【讨论】:

  • @CSSStudent 请注意,由于您最多需要找到 2 条增广路径,因此 Edmonds-Karp 需要线性时间。
  • 我认为这允许顶点多次出现,从而允许非简单路径。例如,图 {xb, yb, bu, bv, uv} 由于 b 处的瓶颈而没有解决方案,但是(我的解释)您的算法将指示路径 xbu 和 ybv,暗示非简单路径 xbuvby。
  • @PeterdeRivaz 谢谢,我稍后会检查这个答案,并确认它是否属实。
猜你喜欢
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
相关资源
最近更新 更多