【发布时间】:2020-02-10 13:40:29
【问题描述】:
我是编程和学习算法的新手,当我读到 BFS 可用于循环检测时,我正在研究 BFS。我尝试在具有邻接表表示的无向图 G 上实现相同的功能。 我所做的如下:
• 使用队列执行简单的 BFS 遍历,同时维护队列中排队节点的父节点。
• 如果我遇到一个节点
u有一个邻居v,这样v已经被访问但v不是u的父级,那么这意味着图中存在循环。
伪代码:
#adjList is the adjacency list given as a dictionary
#myQueue is a double-sided queue containing node and its parent node ([Node, parNode])
#visited is a set containing visited nodes
while(myQueue):
currNode, parNode = myQueue.pop() #dequeue operation
visited.add(currNode) #Marking currNode as visited
for childNode in adjList[currNode]: #Traversing through all children of currNode
if currNode not in visited:
myQueue.appendleft([childNode, currNode]) #Enqueue operation
else:
if childNode!=parNode: #Main logic for cycle detection
print('CYCLE DETECTED')
break
上述方法有效,除非我在 2 个顶点之间有超过 1 条边,例如在以下情况下,我们在顶点 0 和 1 之间有 2 条边:
上图的邻接列表为:adjList = {0:[1, 1, 2], 1:[0, 0], 2:[0]}。这里我们可以清楚地看到该图包含一个循环(在邻接表表示中,1 在0 的邻接表中出现两次,0 在@987654335 的邻接表中出现两次@) 但上述算法无法检测到相同的情况,因为当 BFS 到达顶点 1 时,顶点 0 已被访问,但顶点 0 也是顶点 1 的父节点,因此不会检测到此循环。
我的问题是如何修改上述算法来检测这种情况?
编辑:我也在有向图上尝试了相同的逻辑,并且我面临着类似的问题,即当我有一条从顶点 0 到顶点 1 的有向边和另一个有向边的情况从顶点1到顶点0
【问题讨论】:
标签: graph breadth-first-search graph-traversal cycle-detection