问题描述
是否有一种算法,给定一个未加权的有向无环图,将所有节点排序为一个节点集列表,使得
- 保留拓扑顺序(即,对于所有边
u->v
,v
出现在列表中比u
更靠后的集合中)和 - 列表的长度最小。
这个问题有名字吗?
示例
下图可能的排序是
[1],[2,3],[4,5],[6,7]
另一种解决方案是
[1],[4],[5,6,7]
解决方法
如果没有前驱节点,则定义每个节点的阶段索引为零,或者定义为其前驱节点的最大阶段索引加一。将每个节点放在指定的阶段。
可以按拓扑顺序有效地评估阶段索引,使其成为您最喜欢的拓扑排序算法的轻松扩展。
,考虑规范卡恩算法的这种变体:
- 从包含所有节点的集合 S0 开始,没有传入边
- 初始化下一组 Sn+1
- 对每个节点 N 迭代 Sn:
- 对于所有有来自 N 的边的节点 D,移除边
- 如果 D 没有其他传入边,则将其添加到 Sn+1
- 如果 Sn+1 不为空,则将 pass 增加到 n+1 并从 2 开始重复。
S0 ... Sk 集合的列表包含结果。