我有N nodes
和N-1 connections
的图表(或无根树)。每个连接都有一个distance of 1
。
当 v 与一组节点 E {} 之间的最大距离的 v 节点> v 可以是 E 中的节点吗?
约束:
答案 0 :(得分:1)
我会从节点集E
开始使用breadth first search。 v
将成为您访问的最后一个节点。
修改强>
1-2-3-4 E={1,4,5}
|
5
好的,现在我了解您的指标。您希望为每条边计算该边缘两侧的E
元素之间的距离总和。你可以通过计算从叶子到根的值来做到这一点(手动一点)。
然后,您可以为每个节点计算每个传入边缘上这些值的总和。选择总和最大的节点。
答案 1 :(得分:0)
如果图形是非循环的,则可以使边权重为-1并运行Floyd-Warshall。这将为您提供所有对最长的路径。然后,对于图中的每个节点,取与E中节点的平均距离。
否则我相信在NP-Complete问题中试图找到任意图形中最长的路径。
答案 2 :(得分:0)
这是一个简单的算法,用于计算E
每个顶点的每个节点的距离。
图表是一棵树,最初没有根。
遍历树,并为每个节点计算其子树中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
E
的距离(调用此函数d(v)
)。我们看到d(A)=6
,在步骤2中遍历树时很容易计算出来。然后,再次遍历树,计算每个节点的距离函数,其中公式为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
v
的节点d(v)
,您可以通过再次遍历树来执行此操作。您也可以在步骤4中遍历树的同时执行此操作。此算法仅需要对树进行2次不同的遍历,每次遍历O(n)
次。因此,整体算法复杂度为O(n)
。
请注意,此算法如此高效的原因是图表是树。大多数最短路径算法用于一般图形。树更简单,因为在任何一对顶点之间只有一条唯一的路径。因此,不需要最短路径算法中通常需要的策略。