【问题标题】:Algorithm that returns the path of one cylce in undirected graph返回无向图中一个循环的路径的算法
【发布时间】:2013-11-15 09:37:56
【问题描述】:

我正在尝试构建一种算法,该算法返回构成无向图中的一个循环的路径节点(如果有的话)。到目前为止,我所做的是在图上执行 DFS,直到我到达一个未发现的边缘,导致一个发现的节点(那时我知道有一个循环)。但是我怎么知道是哪条路径形成了循环。如果我使用堆栈/队列来记录我的路径,这对我有什么帮助?假设我从一个不属于循环路径的节点开始,我以后怎么知道将其从堆栈/队列中取出?

任何建议将不胜感激。

【问题讨论】:

  • 你可以做到这一点。当你碰到一个未发现的边缘导致一个发现的节点时,沿着边缘往回走,直到你回到同一个节点,你越过的那些边缘和节点将成为你循环的一部分。但是,这种方法一定会找到任何循环吗?我不确定。
  • 是的,但我如何“走”回来?
  • 如果您在遍历节点时添加节点,只需将它们弹出...否则,您可以创建自己的类型来保存您需要的任何信息...
  • 是的,但是当我走过它们时,我的道路可能非常崎岖不平。我可以分支到一个没有循环的地方(在寻找循环的路上),我怎么知道不包括那个路径。
  • 你需要任何循环还是有一些要求(它必须在特定节点开始/结束;必须访问所有节点等)?

标签: algorithm graph graph-theory


【解决方案1】:

当您执行DFS 记录时,这是您访问每个节点时来自的节点。为新节点调用此parent。现在,当您到达一条边 (u, v) 并通向一个已经访问过的节点 v 时,沿着父节点创建的路径向上走到 u,或到达 DFS 的源头(表示此 s )。

您将始终达到两者之一。如果您到达s,则从v 执行相同的操作,然后您就有了循环 - 从us 的路径,从sv 的路径以及新的边缘。如果你到达v,你又会有一个循环——从uv 的路径,而不是新的边缘。

【讨论】:

  • @AYR 你自己想出它会是很好的练习。我相信我的回答已经足够详细了。
  • 如果我正确理解了您的算法,我不需要使用除用于 DFS 本​​身的堆栈之外的任何堆栈。
  • 您需要一个额外的数组来堆叠每个节点的父节点。此外,我会再使用一个堆栈来重建循环(重建到vs 的路径),但你也可以不用它。
  • @AYR 在遍历图表时,您只需要跟踪从哪个节点直接到达给定节点。如果你考虑一个节点 v,对于 v 的所有尚未访问的邻居,请记住 v 作为到达它们的节点。一旦循环结束(意味着你点击了已经访问过的节点),只需返回 remembered 路径。
猜你喜欢
  • 2016-09-25
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
相关资源
最近更新 更多