因为修改的地方越靠上,影响的节点就越多。
O(n)求出从叶到每个节点的最长时间,对每个子树同步即可。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=500005;
int n,s,head[N],ecnt,dis[N];
long long ans;
struct Edge {
int to,nxt,val;
} e[N<<1];
void add(int bg,int ed,int val) {
e[++ecnt].nxt=head[bg],e[ecnt].to=ed,e[ecnt].val=val,head[bg]=ecnt;
}
int maxl;
void dfs(int x,int fa) {
if(!head[x]) maxl=max(maxl,dis[x]);
for(int i=head[x]; i; i=e[i].nxt) {
int v=e[i].to;
if(v==fa) continue;
dfs(v,x);
dis[x]=max(dis[x],dis[v]+e[i].val);
}
}
void dfs1(int x,int fa) {
for(int i=head[x]; i; i=e[i].nxt) {
int v=e[i].to;
if(v==fa) continue;
dfs1(v,x);
ans+=dis[x]-dis[v]-e[i].val;
}
}
int main() {
scanf("%d%d",&n,&s);
for(int i=1,a,b,v; i<n; i++) {
scanf("%d%d%d",&a,&b,&v);
add(b,a,v);
add(a,b,v);
}
dfs(s,0);
dfs1(s,0);
cout<<ans;
}