我有一组数据需要执行拓扑排序,有一些假设和约束,我想知道是否有人知道一个适合的现有的,有效的算法。
问题可以表述如下:
给定图
S
中的一组节点G
可能有也可能没有入边,找到子图G'
的拓扑排序G
中的所有节点都可以从集合S
中的任何节点访问(服从边缘方向)。
这会混淆拓扑排序的常用方法,因为它们要求集合S
中的节点没有任何传入边缘,这在我的情况下是不正确的。病理案例是:
A --> B --> D
| ^ ^
| | |
\---> C ----/
S = {B, C}
。一个合适的排序是D, B, C
,但如果正常的拓扑排序算法在B
之前考虑C
,那么它最终会以C, D, B
结束,这是完全错误的。 (请注意,A
未出现在生成的排序中,因为它无法从S
访问;它是一个示例,其中S
中的所有节点都可能有传入边缘< / p>
现在,我必须想象这是一个长期解决的问题,因为当你在一个安装命令中指定多个包时,这基本上就像apt
和yum
这样的程序。但是,当我搜索像“依赖性解析算法”这样的关键短语时,我会得到描述正常拓扑排序的结果,这些结果不能处理这种特殊情况。
我可以想到几种方法来做到这一点,但没有一种方法看起来特别优雅。我想知道是否有人有一些指向适当算法的指针,最好是一个可以在数据上单次传递的算法。
答案 0 :(得分:3)
我认为你不会找到一个可以通过数据传递来实现这一目标的算法。我将执行广度优先搜索,从S中的节点开始,然后对结果子图进行拓扑排序。
答案 1 :(得分:1)
我认为你可以对整个图进行拓扑排序,然后只选择可以从节点集中到达的节点(你可以从集合中的节点进行一些深度优先搜索,按顺序在排序,如果之前没有访问过,你将进入节点的子树。)