消息传递(数据加强版)
这段代码的作用是:把输入的一棵树分别以每个节点作为根进行计算,找出使 f[i] 最小的节点,并输出最小值加一以及所有对应节点。
核心变量
g[N]:邻接表,存储树。f[x]:以x为根时,节点x处理完所有子树所需的最大代价。v[x]:DFS 访问标记。ans:保存达到最小代价的根节点。
dp(int x) 的逻辑
for (int y : g[x])
遍历 x 的所有相邻节点,跳过已经访问过的父节点。递归计算每个子树的 f[y],并保存到 d 中。
然后排序:
sort(d + 1, d + d[0] + 1);
设 x 有 k 个子树,排序后的子树代价为 d[1]...d[k],更新:
f[x] = max(f[x], d[i] + k - i + 1);
也就是说,不同子树会产生不同的额外等待时间,最终取所有子树中的最大值。
主函数流程
- 读入树并建立双向边。
- 依次把每个节点
i当作根节点。 - 清空
f和访问标记。 - 调用
dp(i)。 - 记录最小的
f[i]以及所有达到最小值的节点。 - 输出
maxx + 1和对应节点。
复杂度
每个节点都作为根计算一次,每次 DFS 中还会排序子树结果,因此总体复杂度约为:
\[O(n^2 \log n)
\]

浙公网安备 33010602011771号