从文本文件中检测定向图中的循环

时间:2016-03-31 21:33:38

标签: c++ graph directed-acyclic-graphs

我正在尝试从文本文件中读取值,然后确定它所代表的图形是否为DAG。我想知道在时间效率方面最快捷的方法是什么。

这是文本文件

3
2
1,2,
2,3

我正在考虑使用给定的信息制作和邻接列表,然后从那里移动。非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

虽然可能不是最快的一种方法,但是topologically sort图表是Kahn's algorithm。当且仅当算法失败时,图表才有一个周期(参见A NEW APPROACH TO INCREMENTAL CYCLE DETECTION AND RELATED PROBLEMS)。

运行时间为|V|,其中|E|是顶点数,<div id="contactForm"> <li> <label for="develop-leadership">Catégorie de formation</label>[select develop-leadership id:develop-leadership include_blank class:contactForm "Développement du leadership" "second string" "third string"] </li> <li> <div class="hide" id="hide1"> <label for="develop-leadership">Tell us why not</label>[text develop-leadership /50 id:develop-leadership class:contactForm "some text"] </div> </li> </div> 是边数。

Bender等人的论文。 (Robert Tarjan是其中一位作者),Incremental Cycle Detection, Topological Ordering, and Strong Component Maintenance,你可能想看看。

另一篇相关论文是Robot bu Haeupler等人。 (Tarjan再次成为作者之一)。

答案 1 :(得分:0)

您可以使用Depth-First Search简单地遍历整个图表。它的总时间复杂度为 O(| V | + | E |),| V |和| E |分别是顶点和边的数量。

当您使用DFS遍历图形时,您将遇到3种类型的顶点:

  1. 那些你没有踏足的人。
  2. 您目前正在发现的那些。 (即自己或其子女)
  3. 你完全探索过的人(包括其后代)
  4. 实现DFS时,您可以通过通常称为着色顶点的方式跟踪每个顶点在给定时间所处的状态。基本上你没有开始探索的顶点(类型1)将是白色的,你在探索过程中的顶点将是灰色的,而你完全发现的那些顶点(即用尽的)将是黑色的。

    在相关的注释中,当您的DFS运行时,它将分别根据源和目标顶点的类型src和dest遇到4种类型的边。

    1. 树边缘: src属于类型2,dest属于类型1
    2. 后边缘: src属于类型2,dest属于类型2
    3. 前沿: src属于类型2,dest属于类型3,src是dest的祖先
    4. Cross Edge: src是类型2,dest是类型3,src是不是是dest的祖先
    5. 虽然它们是extensively narrated in graph algorithms sections of most algorithms textbooks,但是前缘和交叉边缘并不真正与您的需求相关。您需要考虑的是在遍历树时跟踪是否遇到后边缘(即从灰色顶点到另一个灰色顶点)。

      如果遇到后沿,则意味着您基本上可以从顶点 u 转到其祖先 v 。祖先在这种情况下感觉有点奇怪,因为这不是一棵树而是一张图。尽管如此,请记住,有向边的排序构成了一个类似于树中父节点和子节点的关系,它可能会更直观地掌握这个想法。毕竟,类型1的边缘被称为树边缘,原因是什么,对吗?

      总结一下,使用深度优先搜索探索所有顶点(即在图中探索一个后不要放弃)并寻找回来边缘。如果找到一个,你就有一个周期。