我需要对有向图的节点进行排序,以使向后流动的箭头数(与排序顺序相反)最小。
我可以想到算法(例如,保持交换节点直到没有交换会改善事情)但我不确定它们运行的速度有多快或是否达到了最佳解决方案。
这个问题的名称和复杂性是什么?
答案 0 :(得分:2)
可以使用topological sort.按深度顺序对节点进行排序。但是,这仅适用于不包含循环的图形。您的问题听起来像图中有循环。一种选择是找到周期(参见Tortoise and Hare algorithm了解这样做的方法)并打破周期,记录你打破它的位置。然后对节点进行排序并重新链接。
如果您是出于可视化目的而执行此操作,则会有一个名为GraphViz的图形呈现库,它会执行与您描述的内容非常相似的内容,然后将节点布局。它易于集成和使用,并将呈现给屏幕或各种不同的输出格式。
答案 1 :(得分:0)
经过一番思考后,我意识到问题可以分成两部分: