Graph 如何在无向图的BFS循环检测中处理两个顶点之间的平行边?
我不熟悉编程和学习算法,当我读到BFS可用于循环检测时,我正在研究BFS。我试图在一个具有邻接列表表示的无向图G上实现同样的功能。 我所做的如下: •使用队列执行简单的BFS遍历,同时维护排队节点的父节点 •如果我遇到一个节点Graph 如何在无向图的BFS循环检测中处理两个顶点之间的平行边?,graph,breadth-first-search,graph-traversal,cycle-detection,Graph,Breadth First Search,Graph Traversal,Cycle Detection,我不熟悉编程和学习算法,当我读到BFS可用于循环检测时,我正在研究BFS。我试图在一个具有邻接列表表示的无向图G上实现同样的功能。 我所做的如下: •使用队列执行简单的BFS遍历,同时维护排队节点的父节点 •如果我遇到一个节点u,该节点有一个邻居v,因此v已经被访问,但v不是u的父节点,则表示图中存在循环 伪代码: #adjList is the adjacency list given as a dictionary #myQueue is a double-sided queue conta
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
上述方法有效,但以下情况除外:我在两个顶点之间有一条以上的边,例如,在以下情况下,我们在顶点之间有两条边0
和1
:
上图的邻接列表是:adjList={0:[1,1,2],1:[0,0],2:[0]}
。在这里,我们可以清楚地看到该图包含一个循环(在邻接列表表示中,它由以下事实表示:1
在0
的邻接列表中出现两次,0
在1
的邻接列表中出现两次)但上述算法无法检测到相同的情况,因为当BFS到达顶点1
时,顶点0
已被访问,但顶点0
也是顶点1
的父对象,因此该循环将无法检测到
我的问题是如何修改上述算法以检测此类情况
编辑:我在有向图上也尝试了相同的逻辑,我面临着类似的问题,即当我有一条从顶点
0
到顶点1
的有向边,以及另一条从顶点1
到顶点0
的有向边时,我在堆栈交换中得到了问题的答案。这是答案的答案,我正在从那里复制同样的答案
如果案例到达时,您看到一个节点已经被访问,但它是当前节点的父节点,那么您只需检查它们之间是否存在双边边界。如何做到这一点取决于您的数据结构,但如果您的邻接列表已排序,则只需搜索边并检查其频率
我看到的另一个问题是,邻接列表实际上不包含任何边加倍的信息
对于有向图,您可以完全摆脱“父检查”,因为只有当两条边从u
到v
时,才会出现这种情况,反之亦然
此外,如果图形未连接,请小心,您的BFS不会覆盖所有图形,因此您需要再次从未访问的顶点启动另一个BFS。这对于有向图尤其重要,因为即使图可能是连接的,您的BFS也可能无法覆盖所有图