消息传递(数据加强版)

这段代码的作用是:把输入的一棵树分别以每个节点作为根进行计算,找出使 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);

也就是说,不同子树会产生不同的额外等待时间,最终取所有子树中的最大值。

主函数流程

  1. 读入树并建立双向边。
  2. 依次把每个节点 i 当作根节点。
  3. 清空 f 和访问标记。
  4. 调用 dp(i)。
  5. 记录最小的 f[i] 以及所有达到最小值的节点。
  6. 输出 maxx + 1 和对应节点。

复杂度

每个节点都作为根计算一次,每次 DFS 中还会排序子树结果,因此总体复杂度约为:

\[O(n^2 \log n) \]

posted @ 2026-09-17 20:47  yingMC  阅读(2)  评论(0)    收藏  举报