Algorithm 将DAG转换为二叉树

Algorithm 将DAG转换为二叉树,algorithm,graph,networkx,gremlin,graph-algorithm,Algorithm,Graph,Networkx,Gremlin,Graph Algorithm,我正在尝试将DAG转换为二叉树。考虑下面的图表 我想为上面的树提供以下输出。 因为A,B,C,E形成一个菱形,要把它转换成一棵树,我需要把B和C移动成一条直线 我尝试过以下方法: 拓扑排序:输出为A->D->B->C->E->F 带顺序的拓扑排序:A->[B,C,D]->E->F 拓扑路径为我们提供了一条直线路径。但是,如果可能,我希望保留顺序,即A->D。但是,如果有菱形,我希望节点只有一个父节点,并对这些父节点进行排序 对于上述情况,有没有一种方法可以从DAG生成树?伪代码中的算法 正确

我正在尝试将DAG转换为二叉树。考虑下面的图表

我想为上面的树提供以下输出。

因为A,B,C,E形成一个菱形,要把它转换成一棵树,我需要把B和C移动成一条直线

我尝试过以下方法:

  • 拓扑排序:输出为A->D->B->C->E->F
  • 带顺序的拓扑排序:A->[B,C,D]->E->F
  • 拓扑路径为我们提供了一条直线路径。但是,如果可能,我希望保留顺序,即A->D。但是,如果有菱形,我希望节点只有一个父节点,并对这些父节点进行排序

    对于上述情况,有没有一种方法可以从DAG生成树?

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

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

    我将尝试使用此算法进行试验,并让您知道。这正如预期的那样工作。有没有办法从
    O(n^2)
    减少复杂性。我认为最好的情况是
    O(n)
    复杂性实际上是O(n+M),其中n是顶点的数量,M是边的数量。我的解释简化为O(N^2);注意M=O(N^2),如果图是连通的,则N=O(M)。
     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