使用多个源线性化DAG

时间:2014-09-22 20:38:37

标签: algorithm theory directed-acyclic-graphs

我正在看我的算法书,我看到有一个简单的算法来线性化单个源,通过逐个删除源节点来定向非循环图。有人能举例说明为什么这对多个来源不起作用吗?

2 个答案:

答案 0 :(得分:0)

我假设“线性化”是指通过一对一映射将图形转换为节点序列,以便可以恢复完整的图形。

单源DAG只是一个定向林。你可以将它线性化,例如pre-order traversal,就像一棵树一样,从每个根开始顺序排列。

例如,此图表:

DAG with single-source

成为(a (b c)) (e f g)

一般DAG的问题是您可能不得不多次重复同一个节点:

DAG with multiple sources

将成为(a (b c)) (e (b c) f g),然后当您重建图表时,您可能会得到:

Reconstructed DAG

除非你专门处理重复。您可以线性化为(a (b c)) (e b f g)并通过记住已经重建的节点来解决问题。

无论如何,我认为使用你的节点删除算法,你会在第一次遇到时删除b,这样你就无法从e到达它,你将会得到(a (b c)) (e f g)这是错误的。

答案 1 :(得分:0)

是的,您可以对包含源删除算法的简单DAG的任意数量的不同组件组成的通用DAG进行拓扑排序。

证明并不难。你应该亲自尝试一下。如果你不能得到它,请问,我会给你一个大纲。

但是有一种更简单的方法可以进行拓扑排序。将新的主源节点连接到具有单边的所有DAG源,然后从主源执行深度优先搜索,按照后续顺序应用节点编号(即,在所有后代之后连续编号每个节点已经访问过)。主源获得最高编号。忽略这个。其余节点编号以相反顺序给出拓扑排序。

即。没有必要像源清除算法那样解构图形。