从文本文件中检测有向图中的循环
Detect Cycle In Directed Graph from text file
我试图从文本文件中读取值,然后确定它所代表的图是否是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种类型的顶点:
- 那些你还没有涉足的领域
- 您当前正在发现的。(即自身或其子女)
- 您完全探索过的那些(即包括其后代)
在实现DFS时,您可以通过通常称为对顶点着色来跟踪每个顶点在给定时间处于哪个状态。基本上,你还没有开始探索的顶点(类型1)将是白色的,你正在探索的顶点将是灰色的,而你完全发现的顶点(即耗尽的顶点)将是黑色的。
值得注意的是,当DFS运行时,它将根据源顶点和目标顶点的类型分别遇到4种类型的边,即src和dest。
- 树边缘:src类型为2,dest类型为1
- 后边缘:src类型为2,dest类型为2
- 前沿:src是类型2,dest是类型3,src是dest的祖先
- 交叉边缘:src是类型2,dest是类型3,src不是dest的祖先
尽管大多数算法教科书的图形算法部分都对它们进行了广泛的叙述,但前边缘和交叉边缘与您的需求并不真正相关。您所需要考虑的就是跟踪在遍历树时是否遇到后边缘(即从一个灰色顶点到另一个灰色节点)。
如果你确实遇到了后边缘,这意味着你基本上有能力从一个顶点u到它的祖先v。Ancestor在这种情况下感觉有点奇怪,因为这不是一棵树,而是一张图。尽管如此,请记住,有向边在某种程度上构成了一种类似于树中父节点和子节点的关系,掌握这个想法可能会更直观。毕竟,类型1的边被称为树边是有原因的,对吧?
总之,使用深度优先搜索来探索所有顶点(即,在探索图中的一个树后不要放弃)并寻找后边缘。如果你找到了一个,你就有了一个循环。
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- C++创建指向有向图中节点的指针数组
- 如何仅在 2 个节点之间获取最短路径,给定邻接列表有向图?
- 有向图 - 如何计算图中彼此顶点可到达的顶点数?
- C++计算有向图中的最短路径
- 使用非递归 DFS 检测有向图中的周期
- 如何将这些节点连接为有向图
- 如何使用广度优先搜索确定是否可以在有向图中到达顶点
- 在有向图中精确访问所有节点一次
- 在有向图中查找第二条最短路径
- 关于如何处理有向图的一个想法
- 找到有向图C 的最短路径
- 分析输入文件以创建有向图C++
- 在使用无序多映射实现的有向图中查找循环
- 如何找到在c++中实现的有向图的所有路径作为邻接列表
- 如何创建具有多个数据的节点的有向图
- 有没有任何方法可以快速找到无向/有向图中作为循环一部分的所有边(后边)
- 从文本文件中检测有向图中的循环
- 如何在有向图中的所有边上循环并获得源+目的地
- 用DFS检测有向图中的循环