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

打印有向图中的所有循环

戚晨
2023-03-14

我们可以用这里所述的算法求有向图中的圈数。我需要理解算法。

dfs(adj,node,visited):  
  if (visited[node]):  
    if (node == start):  
      "found a path"  
    return;  
  visited[node]=YES;  
  for child in adj[node]:  
    dfs(adj,child,visited)
  visited[node]=NO; #<- why?

(1)最后那句话到底有什么用处?对algo的工作原理进行简短的描述会很有帮助。由于算法基本上是统计从一个节点返回到同一节点的周期数,所以我们可以使用另一个数组,称之为v,并做以下技巧:

def dfs(adj,node,start,visited):
    if (node in v):
        return
for i in range(len(adj)):
    dfs(adj,i,i,visited)
    v.append(i)

(2)我不能实现我刚才写的算法。这是主要的问题,但我认为我需要理解上面的(1)来理解打印所有循环的代码。

我了解到互联网上有算法,我正在尝试使用这个算法。

共有1个答案

樊宏邈
2023-03-14

让我们尝试绘制一个图/树和DFS的调用堆栈。在我看来,理解这里的线索是要跟踪“被访问的”是如何变化的。例如:

|step |node |visited
|1    |1    |{1: yes}     
|2    |2    |{1: yes, 2: yes}
|3    |6    |{1: yes, 2: yes, 6: yes}
|4    |7    |{1: yes, 2: yes, 6: no, 7: yes}
...

这里有一个有趣的部分,请注意第4步访问的6是如何改变的。我们刚刚从第6个节点返回到第2个节点,这就是为什么第6个节点不在当前路径中的原因。

所以,如果我们真的在visited中找到了一个节点,那意味着我们一直在不断地深入,没有回溯,并且再次找到了这个节点,这意味着这是一个循环。

在我的示例中,这就是节点1最终会发生的情况,如果继续填充DFS调用表,您可以检查它。

 类似资料:
  • 我有一个无向图,它被加载为邻接矩阵。我有一个使用BFS算法检测图中循环的方法。我试图实现的是打印所有的边缘,以一种方式,他们表明一个循环,已经找到。 我可以打印一个图形中的所有边,但我不能只打印那些创建循环的边。我怎么让它工作? 边缘: 图表: 节点: 当前错误输出:显示一个周期的部分边沿,但不是全部边沿 预期输出:打印创建循环的所有边,如上面的示例所示, 我想显示:一条边的结束顶点是循环中另一条

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

  • 问题内容: 对于Python中的类,如何定义一个函数以函数中定义的格式打印类的每个实例? 问题答案: 在这种情况下,我看到两个选择: 垃圾收集器 这样做的缺点是,当您有很多对象时,它会非常慢,但会与您无法控制的类型一起使用。 使用mixin和weakrefs 在这种情况下,所有引用都将作为弱引用存储在列表中。如果您经常创建和删除很多实例,则应在迭代后清理弱引用列表,否则会产生很多麻烦。 这种情况下

  • 我需要找到一个算法来找到有向图中的所有根,在O(n m)。 我有一个寻找单个根的算法: 在v中的某些v上运行DFS(v)。如果结果是一个生成树,则v是根。否则,结果就是树木成林。然后: 在最后一棵树的根上运行DFS(u)。如果结果是一棵生成树,那么u是根。否则,图中没有根 现在,如果我想找到所有的根,最好的方法是每次在最后一棵树的不同顶点上运行上述算法O(n)次吗?假设我找到了一个根,如果另一个根

  • 问题内容: 我有一个动物类,具有几个属性,例如: 我现在想将所有这些属性打印到文本文件中。我现在做的丑陋方式是: 有没有更好的Pythonic方式可以做到这一点? 问题答案: 在这种简单情况下,您可以使用: 如果要将Python对象存储在磁盘上,则应查看一下货架- Python对象持久性 。

  • 问题内容: 我有一堂课,其中包含有关Person的信息,看起来像这样: 我想返回所有变量。我试图使用反射来实现它,如该问题所示,但我无法打印实例变量。 解决此问题的正确方法是什么? 问题答案: 从实现toString: