如果添加到图表中,找到 在有向非循环图中引发循环的所有边的最快方法是什么?
正式:假设你有一个DAG $ G =(V,E)$边缘设置为$ E \ subset V \ times V $。找到所有$ e \ in V \ times V-E $,使图形$ G(e)=(V,E \ cup {e})$至少有一个周期。
蛮力方法是使用DFS来检查$ G(e)$是否有一个周期为所有$ e \ in V \ times V-E $。有更快的方法吗?
答案 0 :(得分:1)
观察:当且仅当[它是自循环或其反向边缘属于DAG的transitive closure]时,边缘才会引发循环。因此,计算传递闭包的问题基本上等同于此。可悲的是,理论上最快的已知算法基于快速矩阵乘法,因此无可救药地不切实际。
如果您对在实践中计算大型DAG的传递闭包感兴趣,维基百科会链接到Esko Nuutila's thesis on the subject。
答案 1 :(得分:0)
对于每个节点X,DFS或BFS,其父母&父母父母等等。这些边缘中的每一个(从X到其任何父母)都会创造一个循环。 性能是O(c)+ O(| V |),其中c是引起循环的边数。
我还建议你尝试实现拓扑排序,这对你来说是一个很好的练习,也是一个类似的概念。