【问题标题】:How to deal with parallel edges between two vertices in cycle detection using BFS in an undirected graph?如何在无向图中使用 BFS 处理循环检测中两个顶点之间的平行边?
【发布时间】: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 条边,例如在以下情况下,我们在顶点 01 之间有 2 条边:

上图的邻接列表为:adjList = {0:[1, 1, 2], 1:[0, 0], 2:[0]}。这里我们可以清楚地看到该图包含一个循环(在邻接表表示中,10 的邻接表中出现两次,0 在@987654335 的邻接表中出现两次@) 但上述算法无法检测到相同的情况,因为当 BFS 到达顶点 1 时,顶点 0 已被访问,但顶点 0 也是顶点 1 的父节点,因此不会检测到此循环。

我的问题是如何修改上述算法来检测这种情况?

编辑:我也在有向图上尝试了相同的逻辑,并且我面临着类似的问题,即当我有一条从顶点 0 到顶点 1 的有向边和另一个有向边的情况从顶点1到顶点0

【问题讨论】:

    标签: graph breadth-first-search graph-traversal cycle-detection


    【解决方案1】:

    我在 Stack Exchange 的 Computer Science Forum 得到了我的问题的答案。这是答案的link,我从那里复制@Simon Weber发布的相同内容

    如果案例到达您看到已访问节点的案例但它是当前节点的父节点,您只需检查它们之间是否存在双刃。如何做到这一点取决于您的数据结构,但如果您的邻接列表已排序,则仅相当于搜索边缘并检查它在那里的频率。

    我看到的另一个问题是您的邻接列表实际上不包含任何边缘加倍的信息。

    对于有向图,您可以完全摆脱“父检查”,因为这种情况的唯一出现是当您有两条边从 uv 时,反之亦然。

    此外,如果图未连接,请注意,您的 BFS 不会覆盖所有图,因此您需要从未访问的顶点再次启动另一个 BFS。这对于有向图尤其重要,因为即使该图可能是连通的,您的 BFS 也可能无法覆盖所有的图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      • 2021-12-09
      相关资源
      最近更新 更多