两遍dfs
void dfs1(int u,int fa){
for(int i = head[u];i;i = e[i].next){
int v = e[i].to;
if(v != fa){
dis1[v] = dis1[u] + e[i].w;
if(dis1[v] > dis1[st]) st = v;
dfs1(v,u);
}
}
}
void dfs2(int u,int fa){
for(int i = head[u];i;i = e[i].next){
int v = e[i].to;
if(v != fa){
dis2[v] = dis2[u] + e[i].w;
if(dis2[v] > dis2[ed]) ed = v;
dfs2(v,u);
}
}
}
int main(){
dfs1(1,0);
dfs2(st,0);
}
树形dp
void dp(int u,int fa){
for(int i = head[u];i;i = e[i].next){
int v = e[i].to;
if(v == fa) continue;
dp(v,u);
d1 = max(d1,dis[u] + dis[v] + e[i].w);
dis[u] = max(dis[u],dis[v] + e[i].w);
}
}