【发布时间】: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 算法的修改版本,因为我们必须根据递增权重迭代所有边;但是,我无法证明这一点。那么,有没有可能进一步降低这个问题的复杂度呢?
【问题讨论】:
标签: c++ algorithm graph minimum-spanning-tree