int calc(int u,int v,int last){ int ret=0; for(auto [vv,w]:g[u]){ if(vv!=v&&vv!=last){ ret=max(ret,w+down[vv]); } } return ret; } void dfs_(int u,int last){ for(auto [v,w]:g[u]){ if(v!=last){ up[v]=max(up[u]+w,w+calc(u,v,last)),dfs_(v,u); } } }