我正在尝试在MST的CLRS中使用ch23,这是一个问题:
给出图G和最小生成树T,假设我们减少了不在T中的边之一的权重。给出一种在修改后的图中找到最小生成树的算法。
我发现的解决方案是在T
中添加这个新的更改边,然后在T中创建一个简单的循环,遍历该循环并删除该循环中的最大权重边, voila < / em>,找到新的更新的MST!
我的问题是,如何在此简单循环上仅遍历节点?因为如果我从T
中这个新添加的边的一个端点开始在T
中进行遍历,则DFS / BFS遍历可能会超出周期。
我能想到的一种解决方案是在添加新边后在biconnected components
中找到T
。仅会发现一个BCC
,这是这个新形成的简单循环,然后我可以在DFS代码中放入特殊条件,说只能遍历此BCC中的边缘/节点,并且一旦有后边缘找到,停止遍历。
编辑:图G已连接且无向btw
答案 0 :(得分:1)
您的解决方案基本上是好的。要使其更加正式,您可以使用Tarjan's bridge-finding algorithm
此算法以线性时间在图形中找到最前沿(也称为桥)。将E'
视为最前沿。容易证明E'
中的每个边都不能不在圆周上。因此,E / E'
必须是图中的循环。
您可以使用哈希映射或数组构建函数来找到E
与cut-edges
集之间的差异
您可以从此处运行简单的for循环,找到要删除的最大重量边缘。
希望有帮助!