MST 是图的所有边的总权重最小的树。因此,第二个最小 mst 将具有图中所有边的第二个最小总权重。
let T -> BEST_MST(对图中的边进行排序,然后使用kruskal算法找到MST)
T ' -> 第二好的 MST
假设 T 有 7 条边,现在要找到 T ' 我们将一一删除这 7 条边中的一条并找到该边的替代品(该边的成本肯定会大于我们刚刚从 T 中删除的边)。
假设原始图有 15 条边
我们最好的 MST ( T ) 有 7 条边
第二好的 MST ( T ' ) 也将只有 7 条边
如何找到T'
在 T 中有 7 条边,现在对于所有这 7 条边,将它们一一移除并找到这些边的替换。
假设 MST ( T ) 中的边 --> { a,b,c,d,e,f,g }
假设我们的答案将是 2nd_BEST_MST,并且最初它具有无限值(我知道这听起来不太好,让我们暂时假设它)。
对于 BEST_MST 中的所有边:
current_edge = 我
找到那个边缘的替代品,那个边缘的替代品肯定会比第 i 个边缘(7 个边缘之一)的重量更大
我们将如何使用 Kruskul 算法找到该边的替换(我们再次找到 MST,因此我们将仅使用 kruskal 算法,但这我们不必再次对边进行排序,因为我们在找到 BEST_MST (T)。
将生成 NEW_MST
2nd_best_MST = min( NEW_MST , 2nd_best_MST )
返回 2nd_best_MST
算法
假设原始图有 10 条边
找到 BEST_MST(使用 kruskal 算法)并假设 BEST_MST 只有 6 条边
弓还有 4 个边缘不在 BEST_MST 中(因为它们的权重值很大,其中一个边缘将为我们提供 2nd_Best_MST
对于 BEST_MST 中不存在的每个边缘“X”(即左侧 4 个边缘),将该边缘添加到 BEST_MST 中,这将创建循环
找到循环中权重最大的边 'K' (除了 new_added_edge 'X' )
临时删除边“K”,这将形成一个新的生成树
计算权重差异并将 weight_difference 与边缘 'X' 映射。
对所有这 4 条边重复第 4 步,并将权重差异最小的生成树返回到 BEST_MST。