定义
- 给定一棵树,树中最远的两个节点之间的距离被称为树的直径。
求法
一 : 两个循环求直径
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);
}
}