找到MST的所有关键边缘

时间:2013-03-30 15:25:39

标签: algorithm graph-theory graph-algorithm minimum-spanning-tree

我从Robert Sedgewick的算法书中得到了这个问题。

  

关键边缘。一个MST边缘,从图中删除会导致   MST重量增加被称为临界边缘。演示如何查找a中的所有关键边   与E log E成比例的时间图。注意:此问题假定边权重   不一定是不同的(否则MST中的所有边都是关键的)。

请建议一种解决此问题的算法。

我能想到的一种方法是及时完成工作E.V. 我的方法是运行kruskal的算法。

但是每当我们遇到一个边缘时,其插入MST会创建一个循环,如果是这样的话 循环已包含具有相同边缘权重的边,然后,已插入的边将不是临界边(否则所有其他MST边都是临界边)。

这个算法是否正确?如何扩展此算法以及时E log E。

2 个答案:

答案 0 :(得分:6)

我认为,当边缘严重时你建议的条件是正确的。但是没有必要实际找到一个循环并测试它的每个边缘。

Kruskal算法以增加的权重顺序添加边缘,因此边缘添加的顺序可以分解为等权重边缘添加的块。在每个等权重块内,如果有多个边连接相同的两个分量,则所有这些边都是非关键的,因为可以选择任何一个其他边。 (我说他们所有非关键因为我们实际上没有给出特定的MST作为输入的一部分 - 如果我们那么这将识别一个特定的边缘来调用非关键的。 Kruskal实际选择的只是初始边缘排序或如何实施排序的人工制品。)

但这还不够:可能是在将重量为4或更小的所有边缘添加到MST之后,我们发现有3个重量为5的边,连接组件对(1,2),(2, 3)和(1,3)。虽然这3个边中没有超过1个连接组件对,但我们只需要(任意)2个 - 使用全部3将创建一个循环。

对于每个等权重块,具有权重w,我们实际需要做的是(概念上)创建一个新图,其中到目前为止MST的每个分量(即使用具有权重

请注意,Kruskal的算法需要时间O(Elog E),而不是O(E),因为你似乎暗示 - 虽然像Bernard Chazelle这样的人已经接近线性时间的MST结构,但TTBOMK还没有人到达那里! :)

答案 1 :(得分:4)

是的,你的算法是正确的。我们可以证明通过将Kruskal算法的执行与类似的执行进行比较,其中一些MST边e的成本变为无穷大。在第一次执行考虑e之前,两个执行都是相同的。在e之后,第一次执行的连接组件少于第二次。这种情况持续存在,直到边缘e'被认为在第二次执行中加入e将具有的组件。由于边e是目前构建的森林之间的唯一差异,它必须属于e'创建的循环。在e'之后,执行做出相同的决定,而森林的差异在于第一次执行e,第二次执行e'。

实现此算法的一种方法是使用动态树,即表示标记林的数据结构。此ADT的一种配置支持对数时间中的以下方法。

  • MakeVertex() - 构造并返回一个新的顶点。
  • 链接(u,c,v) - 顶点u和v不得连接。使用cost c。从顶点u到顶点v创建一个未标记的边。
  • Mark(u,v) - 顶点u和v必须是边e的端点。标记e。
  • 已连接(u,v) - 表示顶点u和v是否已连接。
  • FindMax(u,v) - 必须连接顶点u和v。以最大成本和该成本返回从u到v的唯一路径上未标记边的端点。此边缘的端点按它们出现在路径上的顺序给出。

我没有声称这在实践中是一个很好的算法。动态树木,如瑞士军刀,功能多样但复杂,往往不是最好的工具。我鼓励你思考如何利用这样一个事实,即我们可以等到处理完所有边缘以找出关键边缘是什么。