【发布时间】:2010-12-16 18:52:27
【问题描述】:
请给我使用 BFS 查找循环的伪代码。我知道存在其他此类问题,但没有给出代码。
【问题讨论】:
-
@ppl:如果您查看我的问题并喜欢它,请记得投票 :)
标签: algorithm data-structures graph
请给我使用 BFS 查找循环的伪代码。我知道存在其他此类问题,但没有给出代码。
【问题讨论】:
标签: algorithm data-structures graph
以防万一,DFS 更适合该任务,在有向图中更是如此。如果您已经知道这一点,请忽略它。
至于伪代码,好吧,在无向图中,它是一个传统的 BFS,它会在到达之前标记为已访问的节点时中止并报告发现的循环。您可以找到 BFS here 的伪代码。
在有向图中,它变得更加棘手,因为您必须记住到达节点时您走的是哪条路,而且 DFS 的空间复杂性劣势变得更糟。
编辑:哦,我说的是测试周期图,而不是真正找到周期。使用 DFS 寻找循环几乎是微不足道的,而使用 BFS 寻找循环在实际算法复杂性和代码复杂性方面都复杂得多。这就是你找不到伪代码的原因。
【讨论】:
您可能指的是 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
【讨论】: