Graph 如何在无向图的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

我不熟悉编程和学习算法,当我读到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
上述方法有效,但以下情况除外:我在两个顶点之间有一条以上的边,例如,在以下情况下,我们在顶点之间有两条边
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也可能无法覆盖所有图