【模板】树形DP求直径和负直径
注意,若负直径指广义的直径——可以缩成一个点,树形DP无法正确求出,需要将初值设为0(若大于0则不更新)
void dfs(int u,int fa,ll &d1,ll &d2){
f[u]=f2[u]=0;
for(int i=head[u];i+1;i=e[i].nxt){
if(cut[i]) continue;
int v=e[i].v,w=e[i].w;
if(v==fa) continue;
dfs(v,u,d1,d2);
d1=max(d1,f[v]+w+f[u]);
f[u]=max(f[u],f[v]+w);
d2=min(d2,f2[v]+w+f2[u]);
f2[u]=min(f2[u],f2[v]+w);
}
}