找到MST的关键边缘:可能使用修改的Prim算法?

时间:2014-12-31 00:54:34

标签: c++ algorithm graph minimum-spanning-tree

我在找到“关键边缘”问题的解决方案时遇到了这个问题。我已经解决的原始(C ++)问题是:

  

考虑图G =(V,E)。查找有多少边缘属于所有 MST,属于任何 MST的边数以及有多少边属于某些MST,但不属于所有

让我们分别称为“绿色”,“红色”和“黄色”,以上3个案例中的边缘。

在进行我的研究之后,我遇到了Find all critical edges of an MST,它解决了这个问题。一个人会运行Kruskal算法的修改版本:如果相同权重的两个或多个边连接相同的组件,从而形成一个循环,那么所有这些都是黄色边缘,即可以包含在MST中的边缘(或不包括) 。无可争议地选择的边缘是“绿色”,在同一组件中创建循环的边缘是“红色”。所以,原来的问题已经解决了。

上述算法的问题是它运行在 O(| E | * log | V |),这是Kruskal算法的运行时间(如果我错了请纠正我) )。我正在考虑是否也可以使用Prim的algortihm的修改版本,因为它具有更好的摊销复杂度 O(| E | + | V | log | V |),如果Fibonacci堆是使用

我的感觉是这里不能使用Prim算法的修改版本,因为我们不得不根据递增的权重迭代所有边缘;但是,我无法证明这一点。那么,有可能进一步降低这个问题的复杂性吗?

1 个答案:

答案 0 :(得分:2)

这个问题比最小生成树的灵敏度分析问题容易,这是为了确定在最小生成树变化之前每个树/非树边缘可以增加/减少多少重量。用于MST灵敏度分析的最着名的算法似乎是由于Seth Pettie (2005, arXived 2014),其运行时间为O(| E | log alpha(| E |,| V |))。这非常接近最优(α是反Ackermann)但仍然是超线性的。已知几种具有线性预期运行时间的随机算法。