【发布时间】:2014-07-16 20:10:09
【问题描述】:
如何为有向无环图输出所有可能的拓扑排序?例如,给定一个图,其中 V 指向 W 和 X,W 指向 Y 和 Z,X 指向 Z:
V --> W --> Y
W --> Z
V --> X --> Z
您如何对该图进行拓扑排序以产生所有可能的结果?我能够使用广度优先搜索来获得 V、W、X、Y、Z,并使用深度优先搜索来获得 V、W、Y、Z、X。但无法输出任何其他类型.
【问题讨论】:
-
做一个正常的拓扑排序。每次迭代都会抓取您可以输出的所有项目,并以所有组合输出它们,然后继续进行下一次迭代。
-
@LasseV.Karlsen:这是一个开始,但比这更复杂。假设在第一次迭代中有 2 个没有入边的顶点 A 和 B。 A 和 B 都对 C 有边,但只有 A 对 D 有边。C 和 D 都没有任何出边。那么 A、D、B、C 是有效的拓扑排序,即使 D 出现在 B 之前,并且无法通过您的方法生成。
-
请检查我发布的答案,我上面的评论太简单了,我意识到,也意识到我无法通过评论发布足够好的答案。
-
简而言之,我的评论应该更像:做一个正常的拓扑排序。每次迭代都会抓取您可以输出的所有项目并将它们放入一个列表中,然后将该列表放入一个列表(迭代列表列表)中。然后在完成正常拓扑排序的所有迭代后,对这些列表进行所有排列。但这更难理解,我无法在评论中做到公正,因此我的回答是。
-
@j_random_hacker 没错,我的算法,即使是我在答案中写得更完整的算法,也不适用于该示例,我不知道如何/是否可以修复它。正如我在下面对我的答案的评论中发布的那样,我的算法关注的是找到 a 工作排序顺序,并且不能(很容易)被强制找到 all 排序排列。不确定我的答案是否可以挽救。我会暂时搁置它,但它显然不适用于所有示例,因此我什至不确定它是否在问题本身中找到了示例的所有正确排列。
标签: algorithm sorting graph-algorithm topological-sort