我在找到“关键边缘”问题的解决方案时遇到了这个问题.我已经解决的原始(C)问题是:
Consider a graph G=(V,E). Find how many edges belong to all MSTs, how many edges do not belong to any MST and how many edges belong to some MSTs, but not all.
让我们分别称为“绿色”,“红色”和“黄色”,以上3个案例中的边缘.
在进行我的研究之后,我遇到了Find all critical edges of an MST,它解决了这个问题.一个人会运行Kruskal算法的修改版本:如果相同权重的两个或多个边连接相同的组件,从而形成一个循环,那么所有这些都是黄色边缘,即可以包含在MST中的边缘(或不包括) .无可争议地选择的边缘是“绿色”,在同一组件中创建循环的边缘是“红色”.所以,原来的问题已经解决了.
上述算法的问题在于它运行在O(| E | * log | V |)中,这是Kruskal算法的运行时间(如果我错了请纠正我).我正在考虑是否也可以使用Prim的algortihm的修改版本,因为如果使用Fibonacci堆,它具有更好的摊销复杂度O(| E | | V | log | V |).
我的感觉是这里不能使用Prim算法的修改版本,因为我们不得不根据递增的权重迭代所有边缘;但是,我无法证明这一点.那么,有可能进一步降低这个问题的复杂性吗?
最佳答案 这个问题比最小生成树的灵敏度分析问题容易,这是为了确定在最小生成树改变之前每个树/非树干边缘可以增加/减少多少重量.用于MST灵敏度分析的最着名的算法似乎是由于
Seth Pettie (2005, arXived 2014),运行时间为O(| E | log alpha(| E |,| V |)).这非常接近最优(α是反Ackermann)但仍然是超线性的.已知几种具有线性预期运行时间的随机算法.