注意开longlong
参考神仙题解
自己的风格:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
int n,s,head[1000005],cnt,ans,mdtl[1000005];//max_dis_to_leaves
struct edge{
int v,w,next;
}e[1000005];
inline void add(int u,int v,int w){
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt;
}
inline void dfs(int u,int fa){
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(v==fa)continue;
dfs(v,u);
mdtl[u]=max(mdtl[u],mdtl[v]+e[i].w);
}
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(v==fa)continue;
ans+=mdtl[u]-(mdtl[v]+e[i].w);
}
}
signed main(){
memset(head,-1,sizeof(head));
scanf("%lld%lld",&n,&s);
for(int i=1;i<=n-1;i++){
int a,b,t;
scanf("%lld%lld%lld",&a,&b,&t);
add(a,b,t);
add(b,a,t);
}
dfs(s,0);
printf("%lld\n",ans);
}