【问题标题】:Pseudocode to find cycles in a graph using breadth first search使用广度优先搜索在图中查找循环的伪代码
【发布时间】:2010-12-16 18:52:27
【问题描述】:

请给我使用 BFS 查找循环的伪代码。我知道存在其他此类问题,但没有给出代码。

【问题讨论】:

  • @ppl:如果您查看我的问题并喜欢它,请记得投票 :)

标签: algorithm data-structures graph


【解决方案1】:

以防万一,DFS 更适合该任务,在有向图中更是如此。如果您已经知道这一点,请忽略它。

至于伪代码,好吧,在无向图中,它是一个传统的 BFS,它会在到达之前标记为已访问的节点时中止并报告发现的循环。您可以找到 BFS here 的伪代码。

在有向图中,它变得更加棘手,因为您必须记住到达节点时您走的是哪条路,而且 DFS 的空间复杂性劣势变得更糟。

编辑:哦,我说的是测试周期图,而不是真正找到周期。使用 DFS 寻找循环几乎是微不足道的,而使用 BFS 寻找循环在实际算法复杂性和代码复杂性方面都复杂得多。这就是你找不到伪代码的原因。

【讨论】:

  • 对于无向图,测试是否存在循环,我认为您的解决方案不正确。考虑:o----o
  • 你是说K2?我没看到问题=S
  • 关于在无向图中检测循环的方法,请考虑 2----1。如果我从 1 开始 BFS,我将首先将其标记为已访问并将其添加到队列中。然后,在 while 循环中,我将从队列中检索它并将任何相邻的未访问顶点标记为已访问并将它们添加到队列中。换句话说,我会将 2 添加到队列中。现在,当我从队列中检索 2 时,我将再次考虑它的所有相邻顶点。在这样做时,我还将考虑已经访问过的 1。但是,这并不表示循环。
  • BFS 算法不能那样工作。你不要重复使用弧,否则它总是会以无限循环结束,不管你用你的 BFS 做什么。
  • 我想你没听懂我在说什么。这句话是什么意思:“当到达先前标记为已访问的节点时,中止并报告发现的循环”。在您可能实现的任何 BFS 版本中,BFS 搜索很有可能会到达先前标记为已访问的节点。只是我们忽略了这个节点,不将其添加到队列中。请澄清您所说的“到达”是什么意思;
【解决方案2】:

您可能指的是 DFS,它在循环检测中更为常见,所以我假设您犯了这个错误。更改为 BFS 相当容易,但核心思想保持不变。

func detectCycle()
  for node in graph:
    visited = bool[N]
    set all visited to false
    detectCycle(n, n, visited)

func detectCycle(n, origin, visited)
  for neighbour in graph[n]
    if neighbour == origin
       cycle detected
    if not visited[neighbour]
       visited[neighbour] = true
       detectCycle(neighbour, visited)
       visited[neighbour] = false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多