E63 树形DP P1131 [ZJOI2007] 时态同步
视频链接:E63 树形DP P1131 [ZJOI2007] 时态同步_哔哩哔哩_bilibili
P1131 [ZJOI2007] 时态同步 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
// 树形DP O(n) #include<bits/stdc++.h> using namespace std; const int N=500010; int n,s; long long ans,dis[N]; int head[N],to[N<<1],ne[N<<1],w[N<<1],idx; void add(int x,int y,int z){ to[++idx]=y;w[idx]=z;ne[idx]=head[x];head[x]=idx; } void dfs(int x,int fa){ for(int i=head[x];i;i=ne[i]){ int y=to[i]; if(y==fa) continue; dfs(y,x); dis[x]=max(dis[x],dis[y]+w[i]); } for(int i=head[x];i;i=ne[i]){ int y=to[i]; if(y==fa) continue; ans+=dis[x]-(dis[y]+w[i]); } } int main(){ scanf("%d%d",&n,&s); for(int i=1,x,y,z;i<n;i++){ scanf("%d%d%d",&x,&y,&z); add(x,y,z);add(y,x,z); } dfs(s,0); printf("%lld",ans); }