如何仅在图形中的一个循环上遍历?

时间:2018-10-20 09:09:28

标签: algorithm graph-theory graph-algorithm depth-first-search breadth-first-search

我正在尝试在MST的CLRS中使用ch23,这是一个问题:

  

给出图G和最小生成树T,假设我们减少了不在T中的边之一的权重。给出一种在修改后的图中找到最小生成树的算法。

我发现的解决方案是在T中添加这个新的更改边,然后在T中创建一个简单的循环,遍历该循环并删除该循环中的最大权重边, voila < / em>,找到新的更新的MST!

我的问题是,如何在此简单循环上遍历节点?因为如果我从T中这个新添加的边的一个端点开始在T中进行遍历,则DFS / BFS遍历可能会超出周期。

我能想到的一种解决方案是在添加新边后在biconnected components中找到T。仅会发现一个BCC,这是这个新形成的简单循环,然后我可以在DFS代码中放入特殊条件,说只能遍历此BCC中的边缘/节点,并且一旦有后边缘找到,停止遍历。

编辑:图G已连接且无向btw

1 个答案:

答案 0 :(得分:1)

您的解决方案基本上是好的。要使其更加正式,您可以使用Tarjan's bridge-finding algorithm

此算法以线性时间在图形中找到最前沿(也称为桥)。将E'视为最前沿。容易证明E'中的每个边都不能在圆周上。因此,E / E'必须是图中的循环。

您可以使用哈希映射或数组构建函数来找到Ecut-edges集之间的差异

您可以从此处运行简单的for循环,找到要删除的最大重量边缘。

希望有帮助!