我们得到一个表格的邻接列表
U -> (U,V,C) -> (U,V,C) ...
U2 -> ...
U3 -> ...
.
.
etc
(U,V,C)
表示从 U 到 V 有一条边,成本为 C。
给定的邻接表适用于具有 N 个节点的单个连接树,因此包含 N-1 条边。
给出了一组节点F=F1,F2,F3...Fk
。
现在的问题是在 F 中的节点中找到最长路径的最佳方法是什么?是否可以在 O(N) 中完成?
F中每个节点的DFS是唯一的选择吗?
我们得到一个表格的邻接列表
U -> (U,V,C) -> (U,V,C) ...
U2 -> ...
U3 -> ...
.
.
etc
(U,V,C)
表示从 U 到 V 有一条边,成本为 C。
给定的邻接表适用于具有 N 个节点的单个连接树,因此包含 N-1 条边。
给出了一组节点F=F1,F2,F3...Fk
。
现在的问题是在 F 中的节点中找到最长路径的最佳方法是什么?是否可以在 O(N) 中完成?
F中每个节点的DFS是唯一的选择吗?
我将您的问题理解为要求从集合 F 中找到一对节点,以便这两个节点之间的唯一路径尽可能长。路径是唯一的,因为您的图表是一棵树。
正如您提到的,对于 O(nk) 解决方案,其中 n 是图的大小,k 是集合 F 的大小,可以通过对 F 中的每个节点进行 DFS 来轻松解决这个问题。
但是,您可以通过分而治之的方法更快地解决它。从图中选择任何节点 R,并使用单个 DFS 将 Dist(R, a) 到每个其他节点 aa 的距离制成表格,同时将节点划分为子树 S1,...,Sm,其中 m 是来自 R 的边;也就是说,这些是挂在根 R 处的 m 棵树。现在,对于属于不同子树的任何 f 和 g,它认为它们之间的路径具有 Dist(R, f) + Dist(R, g) 边,所以可以在 O(k^2) 时间内搜索最长的此类路径。此外,您必须递归到子问题 S1,...,Sm 以涵盖最长路径位于其中一棵树内的情况。整体复杂度可能低于 O(nk),但数学留给读者作为练习。
如果我正确理解了您的问题,那么您正在尝试在生成树中找到最长的成本路径。
您可以在 2 次完整遍历中找到路径,即 O(2N) ~ O(N) 对于较大的 N 值。
你应该做下面的步骤。
这不会是您从随机选择一个节点开始的最长成本路径。
您不必从每个节点运行 DFS。