将有向无环图拓扑排序为阶段 示例

问题描述

是否有一种算法,给定一个未加权的有向无环图,将所有节点排序为一个节点集列表,使得

  1. 保留拓扑顺序(即,对于所有边 u->vv 出现在列表中比 u 更靠后的集合中)和
  2. 列表的长度最小。

这个问题有名字吗?

示例

下图可能的排序是

[1],[2,3],[4,5],[6,7]

另一种解决方案是

[1],[4],[5,6,7]

enter image description here

解决方法

如果没有前驱节点,则定义每个节点的阶段索引为零,或者定义为其前驱节点的最大阶段索引加一。将每个节点放在指定的阶段。

可以按拓扑顺序有效地评估阶段索引,使其成为您最喜欢的拓扑排序算法的轻松扩展。

,

考虑规范卡恩算法的这种变体:

  1. 从包含所有节点的集合 S0 开始,没有传入边
  2. 初始化下一组 Sn+1
  3. 对每个节点 N 迭代 Sn:
    1. 对于所有有来自 N 的边的节点 D,移除边
    2. 如果 D 没有其他传入边,则将其添加到 Sn+1
  4. 如果 Sn+1 不为空,则将 pass 增加到 n+1 并从 2 开始重复。

S0 ... Sk 集合的列表包含结果。