【问题标题】:Minimum spanning tree to minimize cost最小生成树以最小化成本
【发布时间】:2015-10-11 07:48:52
【问题描述】:

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

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

Set E 和 Set H 是不同的,它们各自的成本是不相关的。

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

【问题讨论】:

  • 请考虑在您的问题中添加编程语言标签
  • 您有这些道路和高速公路的 x 和 y 坐标,对吗?而你只能使用一种高速公路?
  • 道路和高速公路的最大数量是多少?
  • @fantaghirocco 这个问题没有说任何特定的语言。您可以使用任何您喜欢的语言。
  • 你试过什么?你到底有什么问题(除了你的作业可能明天到期......)?

标签: algorithm minimum-spanning-tree


【解决方案1】:

所以,我们拥有的是一个完全连接的边图。

解决步骤:

  1. 仅找出道路的最小生成树并将其视为最低成本。
  2. 将一条高速公路添加到道路图中,然后再次计算最小生成成本树。
  3. 将第 2 步的成本与更换它的最低成本进行比较,如果它更小的话。
  4. 移除那条高速路。
  5. 返回第 2 步,然后为每条高速公路再次执行这些步骤。

O(nm) = m*mst_cost(n)

【讨论】:

    【解决方案2】:

    使用 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 的一个好方法是使用跳转指针。首先你根 hte 树,然后每个顶点将有指向根的跳转指针(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 之间路径上的最大边权重。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 2019-03-26
      • 1970-01-01
      相关资源
      最近更新 更多