我正在看我的算法书,我看到有一个简单的算法来线性化单个源,通过逐个删除源节点来定向非循环图。有人能举例说明为什么这对多个来源不起作用吗?
答案 0 :(得分:0)
我假设“线性化”是指通过一对一映射将图形转换为节点序列,以便可以恢复完整的图形。
单源DAG只是一个定向林。你可以将它线性化,例如pre-order traversal,就像一棵树一样,从每个根开始顺序排列。
例如,此图表:
成为(a (b c)) (e f g)
。
一般DAG的问题是您可能不得不多次重复同一个节点:
将成为(a (b c)) (e (b c) f g)
,然后当您重建图表时,您可能会得到:
除非你专门处理重复。您可以线性化为(a (b c)) (e b f g)
并通过记住已经重建的节点来解决问题。
无论如何,我认为使用你的节点删除算法,你会在第一次遇到时删除b
,这样你就无法从e
到达它,你将会得到(a (b c)) (e f g)
这是错误的。
答案 1 :(得分:0)
是的,您可以对包含源删除算法的简单DAG的任意数量的不同组件组成的通用DAG进行拓扑排序。
证明并不难。你应该亲自尝试一下。如果你不能得到它,请问,我会给你一个大纲。
但是有一种更简单的方法可以进行拓扑排序。将新的主源节点连接到具有单边的所有DAG源,然后从主源执行深度优先搜索,按照后续顺序应用节点编号(即,在所有后代之后连续编号每个节点已经访问过)。主源获得最高编号。忽略这个。其余节点编号以相反顺序给出拓扑排序。
即。没有必要像源清除算法那样解构图形。