我是编程和学习算法的新手,当我读到 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
和之间有 2 条边1
:
上图的邻接表是:adjList = {0:[1, 1, 2], 1:[0, 0], 2:[0]}
。在这里我们可以清楚地看到该图包含一个循环(在邻接表表示中,它1
在 的邻接表中出现两次并且在 的邻接表中0
出现0
两次1
)但上述算法无法检测到相同的因为当 BFS 到达 vertex 时1
, vertex0
已经被访问过,但 vertex0
也是 vertex 的父级,1
所以这个循环不会被检测到。
我的问题是如何修改上述算法来检测这种情况?
编辑:我也在有向图上尝试了相同的逻辑,并且我面临着类似的问题,即当我有一个从顶点到顶点的有向边0
和1
另一个从顶点1
到顶点的有向边时0