Algorithm 用多个源线性化DAG

Algorithm 用多个源线性化DAG,algorithm,theory,directed-acyclic-graphs,Algorithm,Theory,Directed Acyclic Graphs,我正在看我的算法书,我看到有一个简单的算法,通过逐个删除源节点来线性化单个源、有向无环图。有人能给我举个例子说明为什么这对多个源不起作用吗?我假设“线性化”是指通过一对一的映射将图形转换为一系列节点,这样就可以恢复完整的图形 单源DAG只是一个定向林。例如,您可以将其线性化,就像一棵树一样,从每个根开始按顺序进行 例如,此图: 变成(a(b c))(e f g) 常规DAG的问题在于,您可能必须多次重复同一节点: 将变成(a(b c))(e(b c)f g),然后当您重建图形时,您可能会得到

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

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

单源DAG只是一个定向林。例如,您可以将其线性化,就像一棵树一样,从每个根开始按顺序进行

例如,此图:

变成
(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)
,这是错误的。

是的,可以使用源删除算法对由任意数量的不同组件组成的广义DAG进行拓扑排序,这些组件是简单的DAG

证明并不难。你应该自己试试。如果你看不懂,就问我,我会给你一个提纲

但是有一种更简单的方法来进行topo排序。将新的主源节点连接到具有单条边的所有DAG源,然后从主源执行深度优先搜索,按后期顺序应用节点编号(即,在访问其所有子节点后,对每个节点连续编号)。主源获取的数字最大。忽略这个。其余节点编号按相反顺序进行拓扑排序


也就是说,不需要像源删除算法那样解构图形。

这个问题可能会得到更好的理解。你是指拓扑排序吗?是的,拓扑排序。如果有多个源节点,它就可以工作。随便选一个。我想他说的是拓扑排序。@Gene是的,现在我看到了他的评论。不过,这种线性化的概念对我很有用,所以我将我的答案分享给其他可能也需要它的人:)