树的直径
给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和。树中最远的两个节点之间的距离被称为树的直径,连接这两点的路径被称为树的最长链。后者通常也可称为直径,即直径是一个 数值概念,也可代指一条路径。
树的直径求法
树形DP
1 void dp(int x) { 2 v[x] = 1; 3 for(int i = head[x]; i; i = net[i]) { 4 int y = ver[i]; 5 if(v[y]) continue; 6 dp(y); 7 ans = max(ans, d[x] + d[y] + edge[i]); 8 d[x] = max(d[x], d[y] + edge[i]); 9 } 10 }
二次搜索
- 从任一点开始遍历,找到最远点p;
- 从p开始再次遍历,找到最远点q
原理:p到q就是树的一条直径。因为p必然是直径的一端,否则总能找到一条更长的链,这与直径的定义矛盾。