定义
- 给定一棵树,树中最远的两个节点之间的距离被称为树的直径。
 
求法
一 : 两个循环求直径
int d1 = 1, d2 = 1, len = 0;
for (int i = 1; i <= n; i++) {
	if (i == d1) continue;
	int dis = d[d1] + d[i] - 2 * d[lca(d1, i)];
	if (dis > len) len = dis, d2 = i;
}
len = 0;
for (int i = 1; i <= n; i++) {
	if (i == d2) continue;
	int dis = d[d2] + d[i] - 2 * d[lca(d2, i)];
	if (dis > len) len = dis, d1 = i;
}
二 : 两个 spfa 或 dfs
	spfa(1);
	int p1 = 1;
	for (int i = 1; i <= n; i++) if (d[i] > d[p1]) p1 = i;
	spfa(p1);
	int p2 = 1;
	for (int i = 1; i <= n; i++) if (d[i] > d[p2]) p2 = i;
	int diam = d[p2];
树形dp求直径
void dp(int x) {
	vis[x] = 1;
	for (int i = head[x]; i; i = e[i].next) {
		int v = e[i].to;
		if (vis[v]) continue;
		dp(v);
		ans = max(ans, d[x] + d[v] + e[i].dis);
      		d[x] = max(d[x], d[v] + e[i].dis);
	}
}