【问题标题】:Give minimum permutation weight for edges such that a given set of edge is the Minimum Spanning Tree给出边的最小排列权重,使得给定的边集是最小生成树
【发布时间】:2021-12-30 10:22:25
【问题描述】:

问题:

给定一个包含 N 个节点和 M 条边的图,边的索引从 1 -> M 开始。保证任意2个节点之间都有路径。

您需要为 M 条边分配权重。 权重在[1...M]的范围内,每个数字只能出现一次。

简而言之,答案应该是 [1...M] 的排列数组,其中 arr[i] = x 表示 edge[i] 的权重为 x。

给定一个由 n-1 条边组成的集合 R。 R 保证是图的生成树。

找到一种分配权重的方法,使 R 成为图的最小生成树,如果有多个答案,则打印具有最小字典顺序的答案。

约束:

N, M <= 10^6

示例:

边缘:

3 4
1 2
2 3
1 3
1 4

R = [2, 4, 5]

Answer: 3 4 5 1 2

说明:

如果您像上图那样为图形分配权重,则 MST 将是集合 R,并且它具有最小的字典顺序。

我对 O(N^2) 的看法:

因为它要求最小的字典顺序,所以我遍历边列表,以递增的顺序分配权重。最初,w = 1。可能有 3 种情况:

  • 如果edge[i]在R中,赋权重[i] = w,w加1
  • 如果边缘 [i] 不在 R 中:假设边缘 [i] 连接节点 u 和 v。为 R 中从 u 到 v 的路径中的每个边缘分配权重并增加 w(如果该边缘尚未分配) .然后为edge[i]分配权重并增加w
  • 如果分配了 edge[i],跳过它

有什么方法可以改进我的解决方案,使其可以在 O(N.logN) 或更短的时间内工作?

【问题讨论】:

    标签: algorithm minimum-spanning-tree disjoint-sets


    【解决方案1】:

    是的,有一个 O(m log m) 时间的算法。

    非树边e基本循环e端点之间的树中路径组成>e。给定权重,当且仅当对于每个非树边 e,e 的基本循环中最重的边是 e 本身,生成树是最小的。 p>

    词典目标适用于贪心算法,我们找到边 1 的最低有效分配,然后边 2 给定边 1,然后边 3 给定前面的边,等等。这是核心思想:如果下一个未分配边是非树边,将下一个数字分配给其基本循环中未分配的树边;然后分配下一个数字。

    在示例中,边 3-4 是第一个,边 1-3 和 1-4 完成其基本循环。因此,我们分配 1-3 → ​​1 和 1-4 → 2,然后是 3-4 → 3。接下来是 1-2,一个树边,所以 1-2 → 4。最后,2-3 → ​​5 (1-2和 1-3 已分配)。

    为了有效地实现这一点,我们需要两个要素:一种在基本循环中枚举未分配边的方法,以及一种分配数字的方法。我对前者的建议是存储具有收缩指定边的生成树。我们不需要任何花哨的东西;首先将生成树植根于某处并运行深度优先搜索以记录父指针和深度。 e 的基本循环将由 e 端点的最小共同祖先的路径给出。为了进行收缩,我们添加了一个布尔字段来指示父边是否收缩,然后使用来自不相交集森林的路径压缩技巧。工作将是 O(m log m) 最坏情况,但 O(m) 平均情况。我认为很有可能可以在这里插入离线最不常见的祖先算法,以将最坏的情况降低到 O(m)。

    至于数字分配,我们可以在线性时间内处理。对于每条边,记录导致它被分配的边的索引。最后,通过该索引稳定地进行桶排序,通过将树边缘放在非树之前来打破平局。这可以在 O(m) 时间内完成。

    【讨论】:

    • 你能解释一下收缩部分吗?我做的和你说的完全一样,但我每次都做一个 DFS 来找到基本循环,所以它花了 O(n^2)
    • @unglinh279 对于每个节点,存在三种可能性 1) 它是生成树的(任意选择的)根; parent 字段为 NULL 2) 其父边未收缩; parent 字段指向实际的父级 3)它的父级边缘是收缩的; parent 字段指向某个祖先可通过收缩边到达。这使得扫描 LCA 的效率更高,因为我们可以快速跳过之前收缩的边缘。找到 LCA 后,遍历的所有节点都应该指向 LCA。
    • 是否存在收缩节点指向的父节点高于实际LCA的情况?我们该如何应对?
    • @unglinh279 嗯,我想是的。我们可以停在一个与 LCA 有一条收缩路径的共同祖先处。我们不会以这种方式收缩任何额外的边缘。
    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 2023-04-09
    • 2014-08-15
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多