#sXDPybttg050207. 1581:旅游规划

1581:旅游规划

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

W 市的交通规划出现了重大问题,市政府下定决心在全市各大交通路口安排疏导员来疏导密集的车流。但由于人员不足,W 市市长决定只在最需要安排人员的路口安排人员。

具体来说,W 市的交通网络十分简单,由 nn 个交叉路口和 n1n-1 条街道构成,交叉路口编号依次为 0,1,,n10, 1, \dots, n-1。任意一条街道连接两个交叉路口,且任意两个交叉路口间都存在一条路径互相连接(即该交通网络是一棵树)。

经过长期调查,结果显示,如果一个交叉路口位于 W 市交通网最长路径上,那么这个路口必定拥挤不堪。所谓最长路径,定义为某条路径 p=(v1,v2,v3,,vk)p = (v_1, v_2, v_3, \dots, v_k),路径经过的路口各不相同,且城市中不存在长度大于 kk 的路径(即最长路径是树的直径)。因此最长路径可能不唯一。W 市市长想知道哪些路口位于城市交通网的最长路径上。


输入格式

第一行一个整数 nn

之后 n1n-1 行,每行两个整数 u,vu, v,表示 uuvv 的路口间存在着一条街道。


输出格式

输出包括若干行,每行包括一个整数——某个位于最长路径上的路口编号。为了确保解唯一,请将所有最长路径上的路口编号按编号顺序由小到大依次输出。


样例

样例输入

10
0 1
0 2
0 4
0 6
0 7
1 3
2 5
4 8
6 9

样例输出

0
1
2
3
4
5
6
8
9

样例解释

给定的树结构:

    0
  / | | \ \
 1  2 4 6 7
 |  |   |
 3  5   8
        |
        9

节点0连接1,2,4,6,7,节点1连接3,节点2连接5,节点4连接8,节点6连接9。

树的最长路径(直径)为:3-1-0-2-5 或 9-6-0-2-5 或 8-4-0-2-5 等,长度都是4(边数)。
实际上这棵树的直径长度为4,直径的端点有多个:3,5,8,9。

所有在任意一条直径上的节点都要输出,按编号顺序排序后得到: 0,1,2,3,4,5,6,8,9

(节点7不在任何一条直径上,所以不输出)


数据范围

对于 100%100\% 的数据,1n2×1051 \le n \le 2\times 10^5


时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}

提示
此题要求找出树的所有直径上的节点。

步骤

  1. 找直径的一个端点 uu:从任意节点(如0)出发DFS/BFS找到最远点 uu
  2. 找直径的另一个端点 vv:从 uu 出发DFS/BFS找到最远点 vv,并记录每个节点到 uu 的距离 dudu
  3. vv 出发DFS/BFS得到每个节点到 vv 的距离 dvdv
  4. 直径长度 L=dist(u,v)L = \text{dist}(u,v)
  5. 节点 xx 在直径上当且仅当 du[x]+dv[x]=Ldu[x] + dv[x] = L

证明:对于任意节点 xx,如果它在某条直径上,那么 du[x]+dv[x]=Ldu[x]+dv[x]=L;反之如果 du[x]+dv[x]=Ldu[x]+dv[x]=L,则 xxuuvv 的路径上,而 uuvv 是直径,因此 xx 在直径上。

这样我们可以在 O(n)O(n) 时间内找出所有直径上的节点,并按编号排序输出。