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);
}

 

posted @ 2024-10-10 18:49  董晓  阅读(58)  评论(0编辑  收藏  举报