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

Algorithm 使用拓扑排序打印(不检测)循环,algorithm,graph-algorithm,Algorithm,Graph Algorithm,这是《数据结构与算法分析》第三版中的一个问题,在我们的一次考试中也提出了这个问题。 写下一个算法,对邻接列表表示的图形进行拓扑排序,修改 这样算法就可以打印出一个循环(如果找到的话)。首先,用几句话解释你的想法 句子。(不要使用深度优先搜索,我们只需要修改基本拓扑结构 排序。) 答案是: 如果没有顶点的indegree为0,我们可以通过使用 正指数;因为回溯上的每个顶点都有一个正指数,我们最终 到达顶点两次,就找到了循环 我不理解追溯的部分。追溯是什么意思,我想知道这个答案的伪代码是什么?。感谢

这是《数据结构与算法分析》第三版中的一个问题,在我们的一次考试中也提出了这个问题。 写下一个算法,对邻接列表表示的图形进行拓扑排序,修改 这样算法就可以打印出一个循环(如果找到的话)。首先,用几句话解释你的想法 句子。(不要使用深度优先搜索,我们只需要修改基本拓扑结构 排序。)

答案是: 如果没有顶点的indegree为0,我们可以通过使用 正指数;因为回溯上的每个顶点都有一个正指数,我们最终 到达顶点两次,就找到了循环


我不理解追溯的部分。追溯是什么意思,我想知道这个答案的伪代码是什么?。感谢您的帮助。

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

要打印循环,请从任意位置开始,然后跟随传入的边。由于节点数量有限,因此在某个时刻,您必须第二次到达某个节点。这是您的循环,要打印它,请下次运行它

假设我们的图表是:

a --> b
b --> c, d
c --> b
那么这个图的反转就是

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

因为我们以前见过
b
,所以它一定是周期的一部分。要打印,在完成拓扑排序过程(即,选择一个阶数为0的顶点,将其移除,将其子索引降低1,然后重复该过程)后,我们再次跟踪链接并获得
b,如果假设仍有一些顶点需要探索,并且我们找不到阶数为0的任何顶点,这意味着我们在子图中有一个循环,它是由剩余的未探测顶点形成的,因为在DAG中必须至少有一个顶点的阶数为0。然后我们从这些剩余的顶点中选取一个顶点,沿着图进行跟踪,直到到达起始顶点,这就是循环

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