最小生成树以最小化成本

时间:2015-10-11 07:48:52

标签: algorithm minimum-spanning-tree

有人可以帮我解决这个问题吗?

我们有一组道路,一组H高速公路和一组不同城市。我们还有与每条道路i相关的成本x(i)和与每条高速公路i相关的成本y(i)。我们希望建立连接城市的道路,条件是任何一对城市之间总是有路径,我们最多可以建造一条高速公路,这可能比公路便宜。

设置E和设置H是不同的,它们各自的成本是无关的。

设计一种算法来建造道路(最多只有一条高速公路),以最大限度地降低总成本。

2 个答案:

答案 0 :(得分:0)

所以,我们所拥有的是完全连通的边缘图。

解决方案步骤:

  1. 仅查找道路的最小生成树,并将其视为最低成本。
  2. 将一条高速公路添加到道路图中,再次计算最小跨越成本树。
  3. 将步骤2的成本与替换成本的最低成本进行比较。
  4. 删除那条路。
  5. 回到第2步,然后再为每条高速公路再试一步。
  6.   

    O(nm)= m * mst_cost(n)

答案 1 :(得分:0)

使用Prim或Kruskal构建MST:O(E log V)

问题是最多1条公路的限制。

1。天真的方法来解决这个问题:

对于每条可能的高速公路,从头开始构建MST。

此解决方案的时间复杂度:O(H E log V)

2。备选

想法:如果你构建了一个MST,你可以使用更好的MST来优化MST,如果你有一个你以前没有考虑过的额外可用边缘。

假设新边连接(u,v)。如果使用此边,则可以删除MST中顶点uv之间路径中最昂贵的边。您可以在O(V)时间内找到天真的路径。

使用这个想法,时间复杂度是构建初始MST O(E log V)的成本以及尝试使用每个H高速公路优化MST的时间。因此,总算法复杂度为O(E log V + H V),这比第一种解决方案更好。

3。优化的细化

我们可以找到一种更快捷的方法,而不是使用第二种方法进行天真的路径搜索方法。一个相关问题是LCA(最低共同祖先)。解决LCA的一个好方法是使用跳转指针。首先你根目录树,然后每个顶点都有朝向根的跳跃指针(1步,2步,4步等)。预处理可能花费O(V log V)时间,找到2个顶点的LCA是{{ 1}}最坏的情况(虽然实际上O(log V)通常更好)。

找到LCA后,隐式地为您提供了顶点O(log (depth of tree))u之间的路径。但是,要找到最昂贵的删除边缘可能会很昂贵,因为遍历路径的成本很高。

在一维问题中,可以使用范围最大查询(RMQ)。这使用段树在v时间内解决RMQ。

我们有一棵树,而不是一维空间(就像一个数组)。但是,我们可以应用相同的想法,并构建一个分段树状结构。实际上,这相当于将每条跳转指针捆绑在一起。为了找到LCA,树中的每个顶点都会有朝向根的O(log N)跳转指针。我们可以用跳跃指针捆绑我们跳过的边的最大边缘权重。添加此信息的成本与首先创建跳转指针的成本相同。因此,对LCA算法的细微改进使我们能够在log(tree depth)时间内找到顶点uv之间路径上的最大边权重。

最后,把它放在一起,第三个解决方案的算法复杂度为O(log (depth))或等效O(E log V + H log V)