双向图算法

时间:2012-09-15 21:45:58

标签: algorithm graph-theory

我有N nodesN-1 connections的图表(或无根树)。每个连接都有一个distance of 1

v 与一组节点 E {} 之间的最大距离的 v 节点> v 可以是 E 中的节点吗?

约束:

  • (N <= 50000)
  • E&lt; = N
  • 中的节点数
  • 时间限制1秒

3 个答案:

答案 0 :(得分:1)

我会从节点集E开始使用breadth first searchv将成为您访问的最后一个节点。

修改

1-2-3-4    E={1,4,5}
    |
    5

好的,现在我了解您的指标。您希望为每条边计算该边缘两侧的E元素之间的距离总和。你可以通过计算从叶子到根的值来做到这一点(手动一点)。

然后,您可以为每个节点计算每个传入边缘上这些值的总和。选择总和最大的节点。

答案 1 :(得分:0)

如果图形是非循环的,则可以使边权重为-1并运行Floyd-Warshall。这将为您提供所有对最长的路径。然后,对于图中的每个节点,取与E中节点的平均距离。

否则我相信在NP-Complete问题中试图找到任意图形中最长的路径。

答案 2 :(得分:0)

这是一个简单的算法,用于计算E每个顶点的每个节点的距离。

图表是一棵树,最初没有根。

  1. 任意选择一个节点作为根
  2. 遍历树,并为每个节点计算其子树中E中的顶点数(我们可以将此函数称为e(node))。

    • 例如,如果您的树如下(括号显示E={C,D,I}中的顶点),您将计算如下所示的数字:

      vertices in the graph:              e(v)
      
                A                          3
               / \                        / \
              B  (C)                     1   2
             / \   \                    / \   \
           (D)  F   G                  1   0   1
           /         \                /         \
          H          (I)             0           1
      
  3. 还计算根节点与集合E的距离(调用此函数d(v))。我们看到d(A)=6,在步骤2中遍历树时很容易计算出来。
  4. 然后,再次遍历树,计算每个节点的距离函数,其中公式为d(v) = d(parent(v)) + size(E) - 2*e(v)。对于所有节点,这将花费O(n)时间,因为每个节点都是恒定的时间。

    通过考虑当您从父级移动到子级时,与E中的节点集的距离更改为:

    • 在子树的子树中,E 中的每个节点的距离增加1
    • E中每个节点的距离减少1,这也是孩子的子树

    <强>示例:

    • d(B) = d(A) + size(E) - 2*e(B) = 6 + 3 - 2 = 7
    • d(D) = d(B) + size(E) - 2*e(D) = 7 + 3 - 2 = 8
    • d(H) = d(D) + size(E) - 2*e(H) = 8 + 3 - 0 = 11
    • d(F) = d(B) + size(E) - 2*e(F) = 7 + 3 - 0 = 10
  5. 然后只搜索具有最高v的节点d(v),您可以通过再次遍历树来执行此操作。您也可以在步骤4中遍历树的同时执行此操作。
  6. 此算法仅需要对树进行2次不同的遍历,每次遍历O(n)次。因此,整体算法复杂度为O(n)

    请注意,此算法如此高效的原因是图表是。大多数最短路径算法用于一般图形。树更简单,因为在任何一对顶点之间只有一条唯一的路径。因此,不需要最短路径算法中通常需要的策略。