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

Detect Cycle In Directed Graph from text file

本文关键字:循环 有向图 检测 文件 文本      更新时间:2023-10-16

我试图从文本文件中读取值,然后确定它所代表的图是否是DAG。我想知道从时间效率的角度来看,最快的方法是什么。

这是的文本文件

3
2
1,2,
2,3

我想用给定的信息制作一个邻接列表,然后从那里开始。非常感谢您的任何帮助

一种方法是对图进行拓扑排序,尽管可能不是最快的方法。该图有一个循环,当且仅当算法失败时(参见Kahn算法)。

运行时间为O(|V| + |E|),其中|V|是顶点数,|E|是边数。

Bender等人的一篇论文(Robert Tarjan是作者之一),《增量循环检测和相关问题的新方法》,你可能想看看

另一篇相关论文是Haeupler等人的《增量循环检测、拓扑排序和强组件维护》(Tarjan也是作者之一)。

您可以简单地使用深度优先搜索遍历整个图形。它的总体时间复杂度为O(|V|+|E|),|V|和|E|分别是顶点和边的数量。

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

  1. 那些你还没有涉足的领域
  2. 您当前正在发现的。(即自身或其子女)
  3. 您完全探索过的那些(即包括其后代)

在实现DFS时,您可以通过通常称为对顶点着色来跟踪每个顶点在给定时间处于哪个状态。基本上,你还没有开始探索的顶点(类型1)将是白色的,你正在探索的顶点将是灰色的,而你完全发现的顶点(即耗尽的顶点)将是黑色的。

值得注意的是,当DFS运行时,它将根据源顶点和目标顶点的类型分别遇到4种类型的边,即src和dest。

  1. 树边缘:src类型为2,dest类型为1
  2. 后边缘:src类型为2,dest类型为2
  3. 前沿:src是类型2,dest是类型3,src是dest的祖先
  4. 交叉边缘:src是类型2,dest是类型3,src不是dest的祖先

尽管大多数算法教科书的图形算法部分都对它们进行了广泛的叙述,但前边缘和交叉边缘与您的需求并不真正相关。您所需要考虑的就是跟踪在遍历树时是否遇到后边缘(即从一个灰色顶点到另一个灰色节点)。

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

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