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