找到 MST 的关键边:可以使用修改后的 Prim 算法吗?

Posted

技术标签:

【中文标题】找到 MST 的关键边:可以使用修改后的 Prim 算法吗?【英文标题】:Find critical edges of an MST: possible with modified Prim's algorithm? 【发布时间】:2014-12-31 00:54:34 【问题描述】:

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

考虑一个图 G=(V,E)。找出有多少条边属于所有 MST,有多少条边属于任何 MST,有多少条边属于某些MST,但不属于全部。

让我们分别称“绿色”、“红色”和“黄色”为上述 3 种情况中的边缘。

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

上述算法的问题是它运行在O(|E| * log|V|),这是Kruskal算法的运行时间(如果我错了请纠正我)。我正在考虑是否也可以使用 Prim 算法的修改版本,因为如果斐波那契堆是用过。

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

【问题讨论】:

【参考方案1】:

这个问题比最小生成树的敏感性分析问题更容易,即确定在最小生成树发生变化之前,每棵树/非树的边可以增加/减少多少权重。最知名的 MST 敏感性分析算法似乎归功于 Seth Pettie (2005, arXived 2014),运行时间为 O(|E| log alpha(|E|, |V|))。这非常接近最优(alpha 是逆阿克曼),但仍然是超线性的。已知几种具有线性预期运行时间的随机算法。

【讨论】:

以上是关于找到 MST 的关键边:可以使用修改后的 Prim 算法吗?的主要内容,如果未能解决你的问题,请参考以下文章

The Unique MST POJ - 1679 次小生成树prim

贪心算法之prim算法的证明

POJ #2485 Highways MST中的最大边权

MST-prim

最小生成树-Prim算法和Kruskal算法

如何在 Haskell 中编写 MST 算法(Prim 或 Kruskal)?