如何找到包含给定边的最小生成树?
How can I find a Minimum spanning tree containing a given edge?
在加权无向图中,如果可能的话,我需要找到包含给定边 'e' 的最小生成树。我该怎么做? Kruskal 从 'e' 开始 ?
我会不使用Kruskal算法因为如果边e是循环的一部分并且e具有最大权重在那个循环中,那么算法将不包括'e'。我相信通过修改它可以工作。但是使用 Prim 的算法所需的修改是最小的。
Prim 的算法最适合这个问题,如果我们回忆一下 Prim 算法是这样的:
第 1 步:从包含随机选取的顶点的集合 S 开始。
STEP 2:从集合S中的一个顶点和集合V[中的其他顶点的所有边=56=] - S,挑一个权重最小的那个。设(x,y),x属于S和y 属于 V - S.
步骤 3:添加 y 以设置 S.
STEP 4:重复步骤2和3直到S包含所有顶点。
需要修改:
对于您的问题,只需将步骤 1 更改为:
STEP 1:从集合 S 开始,包含一个顶点 u 和 v 其中边 'e' = (u,v ).
对于懒惰的解决方案,使该边缘的成本为零,并运行任何 MST 算法。
这是一个不需要修改 MST 算法的可能的“惰性解决方案”
- 运行 任何 MST算法。
- MST算法会输出一个MST
T = (V,E,w)
如果边 e 已经在 T 中那么你就完成了
如果边e不在T中,那么加上边e,你会得到一个循环σ
遍历循环 σ,如果有一条边的权重与 e 相同,则删除该边并完成
如果 none 条边的权重与 e 相同,则不可能有 e 的 MST
这种方法的优点在于它很容易形式化证明,因此您有 MST 算法的证明,其他步骤基于已知定理。
在加权无向图中,如果可能的话,我需要找到包含给定边 'e' 的最小生成树。我该怎么做? Kruskal 从 'e' 开始 ?
我会不使用Kruskal算法因为如果边e是循环的一部分并且e具有最大权重在那个循环中,那么算法将不包括'e'。我相信通过修改它可以工作。但是使用 Prim 的算法所需的修改是最小的。
Prim 的算法最适合这个问题,如果我们回忆一下 Prim 算法是这样的:
第 1 步:从包含随机选取的顶点的集合 S 开始。
STEP 2:从集合S中的一个顶点和集合V[中的其他顶点的所有边=56=] - S,挑一个权重最小的那个。设(x,y),x属于S和y 属于 V - S.
步骤 3:添加 y 以设置 S.
STEP 4:重复步骤2和3直到S包含所有顶点。
需要修改:
对于您的问题,只需将步骤 1 更改为:
STEP 1:从集合 S 开始,包含一个顶点 u 和 v 其中边 'e' = (u,v ).
对于懒惰的解决方案,使该边缘的成本为零,并运行任何 MST 算法。
这是一个不需要修改 MST 算法的可能的“惰性解决方案”
- 运行 任何 MST算法。
- MST算法会输出一个MST
T = (V,E,w)
如果边 e 已经在 T 中那么你就完成了
如果边e不在T中,那么加上边e,你会得到一个循环σ
遍历循环 σ,如果有一条边的权重与 e 相同,则删除该边并完成
如果 none 条边的权重与 e 相同,则不可能有 e 的 MST
这种方法的优点在于它很容易形式化证明,因此您有 MST 算法的证明,其他步骤基于已知定理。