给定一个G(V,E)
加权(在边上)图,我需要找到每个MST中属于的边的数量,以及至少属于一个但不是全部但不属于那个的边的数量不属于任何人。
图形以以下形式(示例)作为输入提供:
3 3
1 2 1 ->edge(1,2),weight=1
1 3 1
2 3 1
第一个3
是节点的数量,第二个3
是边的数量。以下三行是第一个数字是它们开始的边缘,第二个是它们结束的边缘,第三个是边缘的边缘值。
我曾考虑过运行一次Kruskal来找到一个MST,然后为属于G
的每个边缘检查(线性?)时间,以确保它可以替换该MST中的边缘而不改变其整体重量。如果不能,它就不属于任何人。如果可以的话,它属于一个但不是全部。我还可以在第一个MST中标记边缘(也许使用第二个值1或0),最后检查不能替换的边缘。这些是每个可能的MST中的成员。
该算法可能是O(V^2)
,我不太确定如何用C ++编写它。我的问题是,我们可以以某种方式降低它的复杂性吗?
如果我在MST上添加了一条边,如何检查(并用C ++实现)形成的循环中是否包含权重较小的边?
答案 0 :(得分:1)
我认为至关重要的是要注意每个MST都具有相同的边缘权重集。具备以下知识:
我们可以将其转换为以下算法。使用Prim的算法,不仅在每一步上,不仅要添加权重最小的边,而且如果存在多个这样的边或类型为{{1,则将具有该权重的所有边标记为II
类型的边}}如果只有一个这样的优势。所有未标记的边缘均为I
类型。
III
-属于所有人,I
-至少属于一个,II
-不属于任何一个。