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

使用BFS进行循环检测

邵伟
2023-03-14

我试图用BFS算法在有向图中检测循环。我检测周期的主要想法是:由于BFS只访问每个节点(和边缘)一次,如果我再次遇到已访问的节点;它会导致一个循环。然而,我的代码有时会找到循环,有时不会。

我从维基百科修改的伪代码如下:

1  procedure BFS(G,v):
2      create a queue Q
3      enqueue v onto Q
4      mark v
5      while Q is not empty:
6          t <- Q.dequeue()
7          if t is what we are looking for:
8              return t
9          for all edges e in G.adjacentEdges(t) do
12             u <- G.adjacentVertex(t,e)
13             if u is not marked:
14                  mark u
15                  enqueue u onto Q
16             else:
17                  print "Cycle detected!" //since we saw this node before

我错过了什么?

共有3个答案

锺离刚洁
2023-03-14

即使不存在循环,您给出的算法也可能报告存在循环。在第12行中,我们有u与t相邻。BFS树中t的父级也位于其邻接列表中<代码>所以,即使不存在循环,第13行也可能返回false,因为t的父级被标记并且是t的邻接列表的一部分

所以,我认为这个算法将报告一个周期,如果它存在的话,但它也可能报告一个周期,即使没有周期。

何辰沛
2023-03-14

实现的问题是,它假定图形是连接的。但现实情况是,你可能要处理一个有两个相连部分的图,因此如果你从v开始,你永远不会进入另一部分。要解决您的问题,您需要找到一种方法来识别可能未连接的子图。你可以在维基百科上找到一些建议http://en.wikipedia.org/wiki/Topological_sorting#Algorithms他们谈论的地方

 S ← Set of all nodes with no incoming edges

编辑:

实际上,您可以做的一个简单更改是不要排队v,而是排队所有节点Dijkstra样式。这样您应该始终找到您的周期。此外,您从哪里获得t,因为它不是方法签名的一部分?

秋飞鸾
2023-03-14

您给出的算法可能会在找到循环之前找到目标节点(并因此退出)。

哪个对你更重要:尽快找到目标还是找到周期?如果您根本不关心目标,可以删除算法的该部分。

 类似资料:
  • 我是编程和学习算法的新手,当我读到BFS可以用于周期检测时,我正在研究BFS。我试图在一个具有邻接表表示的无向图G上实现同样的方法。我所做的如下: •使用队列执行简单的BFS遍历,同时维护队列中排队节点的父节点。 •如果我遇到一个节点,它有一个邻居,这样已经被访问,但是不是的父节点,那么这意味着图中存在循环。 上面的方法是有效的,除非在两个顶点之间有超过1条边,例如,在下面的例子中,我们在顶点之间

  • 问题内容: 我正在使用以下代码: 但是,如果我输入“ w”,它将告诉我“您输入的输入无效。请重试。” 然后它将进入无限循环,显示文本“指定0到5之间的整数:您输入的输入无效。请重试。” 为什么会这样呢?该程序不是应该等待用户输入并在每次到达该语句时按Enter键: 问题答案: 在最后一个块中,您需要清除“ w”或来自扫描仪的其他无效输入。您可以通过调用Scanner并忽略其返回值来丢弃该无效输入来

  • 问题内容: 我正在尝试提高SQL编程的效率。我正在尝试运行一个循环,以对仅按数字后缀更改的字段名称重复执行更新命令。 例如,而不是写出来,然后每次更新: 让我知道是否可以澄清。我正在使用SQL Server 2005。 感谢您的指导。 我正在尝试应用Adams的解决方案,并且需要了解以下N’的正确用法: 问题答案: 这实际上将不起作用,因为您不能在列名中加上引号。您实际上要做的是让SQL比较两个始

  • 问题内容: 当我在 while循环中 使用 try和catch 块时,我的程序有一个无限 循环 。 当我输入一个整数时,它运行良好并要求另一个输入,但是当我输入一个字符时,它将进入无穷循环。为什么会这样呢? 问题答案: 遇到无效输入时,由于nextInt()不使用无效令牌,因此程序进入无限循环。因此,导致该异常的任何令牌都将保留在该位置,并在下次尝试使用nextInt()时继续引发异常。 可以通过

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

  • 我在Symfony项目中使用FOSRestBundle。当我尝试处理视图时,它在使用Symfony序列化器和JMSSerializer序列化我的数据期间失败。 这是呈现响应的方法: DefaultController.php 这些是我的实体: Holding.php Subsidiary.php Brand.php Product.php Commercial.php CommercialRepo