#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e6+10;
struct node{
int to,nxt,w;
}d[N];int head[N],tot=0;
void add(int a,int b,int c){
d[tot]={b,head[a],c};head[a]=tot++;
}
int n,k,f[N];
int m1[N],m2[N],p[N],sz[N];
int dp[N];
void dfs1(int x,int fa){
for(int i=head[x];~i;i=d[i].nxt){
int to=d[i].to;
if(to==fa) continue;
dfs1(to,x);
sz[x]+=sz[to];
if(sz[to]){
dp[x]+=d[i].w*2+dp[to];
if(m1[x]<m1[to]+d[i].w) m2[x]=m1[x],m1[x]=m1[to]+d[i].w,p[x]=to;
else if(m2[x]<m1[to]+d[i].w) m2[x]=m1[to]+d[i].w;
}
}
}
int res[N],up[N];
void dfs2(int x,int fa){
for(int i=head[x];~i;i=d[i].nxt){
int to=d[i].to;
if(to==fa) continue;
if(k-sz[to]){
if(to==p[x]){up[to]=max(up[x],m2[x])+d[i].w;
}else up[to]=max(up[x],m1[x])+d[i].w;
}
res[to]=res[x];
if(sz[to]) res[to]-=d[i].w*2;
if(k-sz[to]) res[to]+=2*d[i].w;
dfs2(to,x);
}
}
int32_t main(){
memset(head,-1,sizeof head);
scanf("%lld%lld",&n,&k);
for(int i=2;i<=n;i++){
int a,b,c;scanf("%lld%lld%lld",&a,&b,&c);
add(a,b,c);add(b,a,c);
}
for(int i=1;i<=k;i++){
int x;scanf("%lld",&x);
sz[x]=1;
}
dfs1(1,0);
res[1]=dp[1];
dfs2(1,0);
for(int i=1;i<=n;i++){
cout<<res[i]-max(up[i],m1[i])<<endl;
}
}
2020 CCPC-Wannafly Winter Camp Day3 Div.1&2 火山哥周游世界(换根dp
最新推荐文章于 2022-03-14 18:13:28 发布