【问题标题】:Find maximal weight edge between two nodes in an undirected acyclic graph在无向无环图中找到两个节点之间的最大权重边
【发布时间】:2019-06-16 14:58:39
【问题描述】:

我们有一个包含 N 个节点和 N-1 个双向边的图(每条边都有一些权重 w)。 现在我们必须回答 q 个查询。每个查询给出两个节点 uv 以及任意边 x 处的最大允许成本。如果从 uv 的路径之间所有边的单个边权值小于或等于 x,那么我们打印 Yes 否则我们打印 No

约束如下:
1 ≤ N,q ≤ 10^6
1 ≤ w,x ≤ 10^9

我尝试了蛮力解决方案,但它提供了 TLE。我知道我必须做一些预处理,但无法克服它。 我在这里发现了一个类似的问题,但没有人明确解决这部分问题。
Maximum edge weight from one node A to node B.
您可以访问该链接以更好地解释问题。

【问题讨论】:

  • 你可以用 Dijkstra 算法解决这个问题,因为每个节点最多有一个边,这将导致 O(n) 算法在这里.在执行 Dijkstra 算法时,您可以同时“优化”图形,以便在第一个查询中完成的工作可以在第二个查询中被利用。
  • 请在答案中解释该优化。我太天真了,无法理解,因为我的知识仅限于标准 Dijkstra 算法。
  • 标准Dijkstra算法。
  • 我不明白如何优化图表以在进一步查询中利用。请至少提供伪代码或一些解释。
  • 我投票决定将此问题作为题外话结束,因为这是一个关于计算机科学而非编程的问题。

标签: algorithm graph-theory undirected-graph


【解决方案1】:

这可以很容易地使用Union Find(也称为Diesjoint Set Union,如果从未听说过你可以查找实现here)数据结构在O(nlog(n) + q em>log(q))

  1. 读取所有查询并将它们存储在某个数组结构中(保留查询信息 u v x 和查询索引)

  2. 按权重对所有查询进行排序

  3. 按权重对所有边进行排序

  4. 遍历所有查询,如果需要,将所有仍未合并的边与权重合并

  5. 如果节点 u 和 v 在同一个连通分量中 (Find(u)==Find(v)),则此查询的答案是 Yes else no

  6. 按需要的顺序打印答案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    相关资源
    最近更新 更多