当前位置: 首页 > 知识库问答 >
问题:

如何在无向图中利用BFS进行循环检测中处理两个顶点之间的平行边?

逄嘉禧
2023-03-14

我是编程和学习算法的新手,当我读到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 html" target="_blank">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

上面的方法是有效的,除非在两个顶点之间有超过1条边,例如,在下面的例子中,我们在顶点之间有2条边01:

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

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

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

共有1个答案

戴浩初
2023-03-14

我在堆栈交换的计算机科学论坛上得到了我问题的答案。这是答案的链接,我从那里复制了@Simon Weber发布的同样的答案

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

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

 类似资料:
  • 我试图用BFS算法在有向图中检测循环。我检测周期的主要想法是:由于BFS只访问每个节点(和边缘)一次,如果我再次遇到已访问的节点;它会导致一个循环。然而,我的代码有时会找到循环,有时不会。 我从维基百科修改的伪代码如下: 我错过了什么?

  • 目前我正在用这个样本进行拓扑排序,并对https://www.geeksforgeeks.org/topological-sorting/做了一些修改 我用它来排序要求解的变量的顺序。 样本 每个变量都有一个唯一整数,并存储在一个映射中 创建图形并添加边时,总共有4个顶点,因此我的代码将像这样构造图形 排序并按相反顺序得到结果后,它是正确的c 一切都很好,但我需要检测图中的循环引用。假设变量是 有

  • 另一个问题只回答了如何检测一个周期,而不是输出它。所以,我想在一个无向图上写一个算法,在O(V+E)时间内运行BFS或DFS(V=顶点,E=边),如果有循环,则输出循环。 到目前为止,我所知道的是BFS/DFS是如何工作的,如果访问已经标记为已访问的节点,可以使用BFS检测周期。

  • 枚举任意图中两个顶点之间的所有简单路径通常需要指数时间,因为顶点之间可能存在指数数量的简单路径。但是如果我们只对两个endpoint顶点之间至少一条简单路径上的顶点感兴趣呢? 也就是说:给定一个无向图和两个不同的顶点,是否有多项式时间算法可以找到两个顶点之间至少一条简单路径上的每个顶点?这与连通性不同;不包括死胡同和死胡同。然而,分支和连接路径是允许的。 我发现编写一个看起来可以解决这个问题的算法

  • 我在这里读到一篇关于在有向图中求圈的讨论。现在,OP声称我们需要验证两件事: 从到有一个后沿 在递归堆栈中 为什么我们需要第二次测试?你能举个例子来说明它的必要性吗?

  • 我有一个算法来寻找有向图从一个顶点u到任何其他顶点的边,它具有O(V+E)的时间复杂度(基于DFS)。我必须开发一个算法来找到O(VE)中任意两个顶点u和v之间的边。 你有什么建议或暗示来实现这一点吗? 如果我对每个顶点重复dfs-visite,那么只有第一次顶点是白色的,接下来的调用将不起作用。如果我在做之前重置颜色,那么算法将是O(v^2+VE)。 提前谢谢你!