对图表进行排序,以使尽可能多的箭头指向前方

时间:2009-04-21 08:15:56

标签: algorithm sorting graph directed-graph

我需要对有向图的节点进行排序,以使向后流动的箭头数(与排序顺序相反)最小。

我可以想到算法(例如,保持交换节点直到没有交换会改善事情)但我不确定它们运行的​​速度有多快或是否达到了最佳解决方案。

这个问题的名称和复杂性是什么?

2 个答案:

答案 0 :(得分:2)

可以使用topological sort.按深度顺序对节点进行排序。但是,这仅适用于不包含循环的图形。您的问题听起来像图中有循环。一种选择是找到周期(参见Tortoise and Hare algorithm了解这样做的方法)并打破周期,记录你打破它的位置。然后对节点进行排序并重新链接。

如果您是出于可视化目的而执行此操作,则会有一个名为GraphViz的图形呈现库,它会执行与您描述的内容非常相似的内容,然后将节点布局。它易于集成和使用,并将呈现给屏幕或各种不同的输出格式。

答案 1 :(得分:0)

经过一番思考后,我意识到问题可以分成两部分:

  1. 确定图表的最大非循环子图(is NP-hard
  2. 拓扑排序(a lot easier