【问题标题】:Count number of pairs of nodes in undirected graph such that W - L >= K计算无向图中的节点对数,使得 W - L >= K
【发布时间】:2021-09-30 11:43:59
【问题描述】:

问题:

给定一个由 N 个节点和 N-1 条边组成的无向图。所有边的长度为1。每条边i的权重为Wi(0

保证图表没有任何循环。所以两个节点之间总是有一个(也是唯一的)最短路径。

从图中取出一对节点(u, v):

  • l 是两个节点之间最短路径的长度
  • w是2个节点间最短路径中权重最大的边

给定数字K,计算图中对(u, v)的数量,使得w - l >= K

示例:

N = 3, K = 1
Edges:
1 - 2 - 3
1 - 3 - 2

(边被描述为:u - v - w)

答案:6。所有可能的对是:(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)

蛮力解决方案(N

遍历所有 (u, v) 对,找到与 wl 并排的最短路径。如果 w - l >= K,则增加答案。

时间复杂度:O(N^3)

P/S: 我已经尝试并成功了蛮力解决方案(N

【问题讨论】:

  • “两个节点之间最短路径的最大权重”是什么意思?是路径中权重最高的边还是总路径成本,比较两个节点之间的不同最短路径?如果uv 之间的两条最短路径具有不同的最大单边权重怎么办?有没有假设从 u 到 v 只有一条最短路径?
  • @גלעדברקן “两个节点之间最短路径的最大权重”是路径中权重最高的边。每对 (u, v) 节点只有 1 条最短路径。
  • 这是在线测试的地方吗?
  • 提示:质心分解的时间复杂度应该在 O(n log²(n)) 左右
  • 您的图是一棵树(无环,n 个节点,n-1 条边),因此任何一对节点之间只有一条路径。

标签: algorithm graph-theory undirected-graph


【解决方案1】:

解决 user202729 的提示:

  1. 找到质心(移除后留下子树的顶点,每个子树最多有整棵树的一半顶点)。

  2. 计算路径包含质心的对 (u, v)。

  3. 删除质心并对每个子树进行递归操作。

第 1 步是 O(n)(有一个标准算法),第 2 步将是 O(n log n),所以主定理给出了 O(n log2 n) 的整体.

要实现第 2 步,请在质心处对树进行根处理,并为质心及其每个子节点计算每个深度的后代数量。将 O(log n) 时间前缀和的结果放入 Fenwick 树中。

现在,按权重对边缘进行排序。从最重的边 e 开始,一直到最轻的边,我们计算路径以 e 作为最重边的对。边 e 连接父母和孩子;让 x 成为孩子。对于 x 的每个(不适当的,因此包括 x)后代 u,令 ℓ* = w - K 是最大的 ℓ,使得 w - ℓ ≥ K。使用两个前缀和,计算深度处的其他子树中的顶点 v 的数量大多数 ℓ* - 深度(u)。然后对 Fenwick 树进行更新以将 u 从计数中删除。

【讨论】:

  • 我不太了解芬威克树的用途,里面有什么存储?您能否更清楚地解释最后一步?
  • @unglinh279 我们需要存储(例如)在距根的距离为 1 处有 10 个顶点,在距离 2 处有 30 个,在距离 3 处有 25 个,并且能够快速回答诸如“有多少顶点在距离≤2?"并在我们处理一个顶点后减少计数。
  • 如果有时间,能否提供一个伪代码?我了解质心和 Fenwick Trees 部分,但无法计算出如何计算每个边的顶点数。 ——
  • 带边缘的部分,是否在步骤 1 到 3 对整个树完成之后发生?还是每个步骤 2 的一部分?
  • @don't talk just code it's part of step 2. 我们可以在实践中通过执行一次排序和选择来节省时间,但 Fenwick 树将保持渐近运行时间不变。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多