树的直径
树的直径 = ( (经过某个节点的) 最长链 + 次长链)
设 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);
}
}

浙公网安备 33010602011771号