树的直径

树的直径 = ( (经过某个节点的) 最长链 + 次长链)

设 D[x] 表示从节点 x 出发走向以 x 为根的子树,能够到达的最远距离。
设 x 的子节点为 y1,y2....yt,edge(x,y)表示边权,显然有: D[x] = max(D[yi] + edge(x,yi))(i 的范围是 1 - t)
也就是说,从 根节点出发,找到自己的最小辈,然后从最小辈向根节点更新,找一个最长的路径链。
只要子节点是最长的,那么我们更新到根节点时,这条链毫无疑问也就是最长的。

void work(int now)
{
	for(int i=head[now];i;i=edge[i].nxt)
	{
		int to=edge[i].to,w=edge[i].w;
		if(vis[to]) continue;
		vis[to]=1;
		work(to);
                //还未更新最长路径时,dis [ now ] 存储的时当前 次最长,所以要先更新答案
		ans=max(ans,dis[now]+dis[to]+w);
		dis[now]=max(dis[now],dis[to]+w);
	}
}
posted @ 2025-03-12 21:27  石磨豆浆  阅读(39)  评论(0)    收藏  举报