【发布时间】:2016-05-07 09:43:35
【问题描述】:
给定一个无向图 G = (V, E)。首先它被问到MST的成本是多少。 我可以使用 Kruskall 算法轻松找出,如下所示:
G = (V, E)
for each edge (u, v) in E sorted by wight
{
if(Find(u) != Find(v))
{
Add (u, v) to the MST
Union(u, v); // put u and v in the same set
}
}
之后,对于初始图中的每条边,询问如果该边出现在最小生成树中,新 MST 的成本是多少。
如果 MST 中已经存在边,则答案保持不变。否则,我可以再次运行 Kruskall。伪代码如下:
G = (V, E)
G1 = runKruskall(G)
for each edge (u, v) in E
{
ClearUnionSets()
if (u, v) in G1
{
print costOf(G1)
} else {
Union(u, v)
G2 = runKruskall(G)
print costOf(G2)
}
}
这种方法的问题在于总复杂度为:O(E*E)
我的问题是,是否存在更新 MST 的更好解决方案,如上所述。
我在想的是,当第一次运行 Kruskall 时,对于每条边 (u, v),如果 u 和 v 在同一个集合中,找到部分 MST 中已经存在的最大加权边,这使得一个带有 (u, v) 的循环,并将该信息存储在矩阵 M 中的 M[u][v] 中。这样做,当一条边成为强制性时更新 MST 的问题将在 O(1) 中得到解决。
谁能帮我解决这个问题?
【问题讨论】:
标签: algorithm computer-science graph-algorithm kruskals-algorithm