遍历图,构建一组反向边和叶节点列表。
首先使用叶节点(现在是根节点)对反向边执行拓扑排序。
根据从排序列表末尾开始的反转边构造反转图。由于节点是按逆拓扑顺序构造的,因此保证在构造节点之前已经构造了给定节点的子节点,因此可以创建不可变的表示。
如果您使用跟踪与节点关联的两个方向上的所有链接的中间表示结构,则为 O(N);如果使用排序来查找节点的所有链接,则为 O(NlnN)。对于小图或不受堆栈溢出影响的语言,您可以懒惰地构造图,而不是显式执行拓扑排序。因此,这在一定程度上取决于您所实现的内容,这会有多大的不同。
A -> (B -> G, C -> (E -> F, D -> F))
original roots: [ A ]
original links: [ AB, BG, AC, CE, EF, CD, DF ]
reversed links: [ BA, GB, CA, EC, FE, DC, FD ]
reversed roots: [ G, F ]
reversed links: [ BA, CA, DC, EC, FE, FD, GB ] (in order of source)
topologically sorted: [ G, B, F, E, D, C, A ]
construction order : A, C->A, D->C, E->C, F->(D,E), B->A, G->B