繁体   English   中英

最小的生成树以最小化成本

[英]Minimum spanning tree to minimize cost

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

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

集合E和集合H不同,并且它们各自的成本无关。

设计一种算法来构建道路(最多具有一条高速公路),以最小化总成本。

因此,我们拥有的是边的完全连接图。

解决步骤:

  1. 查找仅道路的最小生成树,并将其视为最低成本。
  2. 在道路图上添加一条高速公路,然后再次计算最小生成成本树。
  3. 比较第2步的成本和最小的成本(如果较小的话)。
  4. 删除高方式。
  5. 返回第2步,然后针对每个高速公路再次执行该步骤。

O(纳米)= m * mst_cost(n)

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

问题是最多只能有1条高速公路。

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

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

该解决方案的时间复杂度: O(HE log V)

2.替代

想法:如果您构建了一个MST,并且您有一个以前从未考虑过的可用边缘,则可以使用更好的MST来优化MST。

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

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

3.优化细化

不用第二种方法来做简单的路径搜索方法,我们可以找到一种更快的方法。 一个相关的问题是LCA(最低共同祖先)。 解决LCA的一个好方法是使用跳转指针。 首先,您要树根,然后每个顶点将具有指向根的跳转指针(1步,2步,4步等)。预处理可能会花费O(V log V)时间,而找到2个顶点的LCA为O(log V)最坏的情况(尽管实际上是O(log (depth of tree))通常更好)。

一旦找到LCA,就会隐式地为您提供顶点uv之间的路径。 但是,找到最昂贵的边来删除可能会很昂贵,因为遍历路径非常昂贵。

在一维问题中,可以采用范围最大查询(RMQ)。 这使用段树来解决O(log N)时间中的RMQ。

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

最后,综合起来,该第三种解决方案的算法复杂度为O(E log V + H log V)或等效地O((E+H) log V)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM