缘起
继续练习树的直径 hdu 2196 Computer 此题是树形dp超经典题~
分析
1 | 对于树上(双向边)的每一个节点求出与其距离最远的点的距离。 |
树形dp超经典题. 首先, 计算机之间形成的数据结构就是一棵(无向)树. 而计算一个顶点到其他所有顶点中最大的距离? 根据【1】中关于树的直径的论述,其实树上一个节点u到达树上的另一个节点P达到了最大的话, 则P一定是树的直径的一端. 而如果对每个顶点使用【1】中第一次bfs的手段. 则复杂度是O(N^2)的,对于N达到1w, 这种复杂度是不可接受的.
一定会被T掉! 但是真的有必要对每个树上的节点进行bfs么? 其实根据【1】中关于树的直径的论述,假设树的直径的另一端是Q. 即PQ是树的直径的话, 则树上任何一点达到它最大的距离一定要么是和P的距离要么是和Q的距离(此乃破题的关键!!!)(两者取大即可). 所以这就好办了. 我们完全可以使用2次bfs,得到树的直径的两端. 并且在第二次bfs(即从P出发)的时候得到所有节点距离树的直径的一端的最长距离(其实哪有什么最长距离,树上任何两点之间的路径是唯一的.), 然后再次从Q出发bfs得到其他节点到Q的距离. 然后两者取大即可.
当然,因为【1】中求树的直径使用了bfs, 这里换个花样——使用dfs求树的直径,都是搜索一样的复杂度~
好吧~ 我承认代码写的真丑~ 但是简明易懂~
1 | //#include "stdafx.h" |
ac情况
Status | Accepted |
---|---|
Time | 31ms |
Memory | 1932kB |
Length | 1791 |
Lang | G++ |
Submitted | 2019-09-10 09:39:47 |
Shared | |
RemoteRunId | 30542550 |
参考
【1】https://yfsyfs.github.io/2019/09/10/poj-1985-Cow-Marathon-%E6%A0%91%E7%9A%84%E7%9B%B4%E5%BE%84/
Powered By Valine
v1.5.2
v1.5.2