将 DAG 转换为二叉树

时间:2021-03-09 16:35:54

标签: algorithm graph networkx gremlin graph-algorithm

我正在尝试将 DAG 转换为二叉树。考虑下图 enter image description here

我想为上面的树提供以下输出。 enter image description here

由于 A、B、C、E 形成一个菱形,要将其转换为一棵树,我需要将 B 和 C 移动成一条线。

我尝试了以下操作:

  1. 拓扑排序:输出是 A -> D -> B -> C -> E -> F。
  2. 拓扑排序顺序:A -> [B,C,D] -> E -> F

拓扑路径为我们提供了一条直线路径。但是,如果可能,我想保留序列,即 A -> D。但是,如果有一个菱形,我希望一个节点只有一个父节点并且对这些父节点进行排序。

对于上述情况,有没有办法从 DAG 生成一棵树?

1 个答案:

答案 0 :(得分:1)

伪代码算法

 Run a topological sort on the graph

 For every node B, in reverse order of the topological sort:
    If B has more than one parent:
        Order its parents A1, A2, ..., An in the order of the topological sort
        For every i in 1..n-1:
            Add an arc from Ai to A(i+1)
            Remove the arc from Ai to B

正确性证明

  • 算法总是终止,因为它是一个固定长度的循环;它的时间复杂度是 O(N^2),其中 N 是节点数
  • 紧接在给定节点 B 上的步骤之后,B 的父节点不超过一个
  • 如果在给定节点 C 上的步骤已经执行,那么在拓扑顺序中位于 C 之前的节点 B 上执行步骤只会向在拓扑顺序中位于 C 之前的节点添加弧;因此,一旦执行了节点的步骤,它们就永远不会获得新的父节点。

这证明算法终止,并且每个节点在执行算法后至多有一个父节点。由于我们只从具有多个父节点的节点中删除父节点,因此我认为这也满足了您的问题。

相关问题