树的直径

定义

  • 给定一棵树,树中最远的两个节点之间的距离被称为树的直径。

求法

一 : 两个循环求直径

  • 首先先求一个lca
  • 然后两遍for循环。
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);
	}
}
原文地址:https://www.cnblogs.com/hellohhy/p/13663144.html