使用拓扑排序打印(不检测)循环

时间:2011-12-13 20:05:50

标签: algorithm graph-algorithm

这是数据结构和算法分析第3版中的一个问题,我们在其中一门考试中也提到了这个问题。 记下算法以拓扑排序由修改的邻接列表表示的图形 如果找到,算法会打印出一个循环。首先,在几个方面解释你的想法 句子。 (不要使用深度优先搜索,我们只想修改基本拓扑 排序。)

答案是: 如果没有顶点具有indegree 0,我们可以通过向后跟踪顶点来找到一个循环 积极的;因为跟踪背上的每个顶点都有一个正的indegree,我们最终 到达顶点两次,并找到了循环。

我不明白该部分追溯。“追溯”是什么意思,我想知道这个答案的伪代码是怎样的?感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

Kahns算法通过选择具有indegree 0的节点并移除其所有传出边(可能产生具有indegree 0的新节点)来工作。如果找不到更多的indegree 0节点(现在图形不为空),则它包含一个循环。

要打印循环,请从任意位置开始,然后按照传入边缘进行操作。由于节点数量有限,因此在某些时候您必须第二次到达节点。这是你的周期,打印它,再运行一次。

说我们的图表是:

a --> b
b --> c, d
c --> b

这个图的反转是

a <-- 
b <-- a, c
c <-- b
d <-- b

拓扑排序以a开头,将其删除。 b现在是b <-- c

现在我们从任何地方开始,比如d并向后搜索。

d <-- b <-- c <-- b

因为我们之前见过b,所以它必须是周期的一部分。要进行打印,我们会再次关注这些链接并获取b <-- c <-- b

如果有任何死胡同 - 例如a - 它会在检测到循环之前已经被拓扑排序算法删除。

答案 1 :(得分:0)

在完成拓扑排序的过程后(即选择一个入度为0的顶点,将其移除,将其子入度减少1,然后重复该过程),如果还有一些顶点需要探索并且我们找不到任何入度为 0 的顶点,这意味着我们在由剩余的未探索顶点形成的子图中有一个循环,因为在 DAG 中必须至少有一个入度为 0 的顶点。然后我们选择从这些剩下的顶点中取一个顶点,沿着图一直走直到到达起始顶点,这就是循环。