题目↑
我的60分code↓
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int gin(){
char c=getchar();
int s=0,f=1;
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
s=(s<<3)+(s<<1)+(c^48);
c=getchar();
}
return s*f;
}
const int N=5e5+5;
int n,m,d[N],head[N],f[N],tot=0,d1,d2;
struct edge{
int dis,ne,to;
}e[N];
inline void add(int u,int v,int w){
e[++tot].dis=w;
e[tot].to=v;
e[tot].ne=head[u];
head[u]=tot;
}
inline void dfs(int u,int fa){
if(!e[head[u]].ne)f[u]=d[u];
for(int i=head[u];i;i=e[i].ne){
int v=e[i].to;
if(v==fa)continue;
d[v]=d[u]+e[i].dis;
dfs(v,u);
f[u]=max(f[u],f[v]);
}
}
signed main(){
n=gin(),m=gin();
for(int i=1;i<n;i++){
int u=gin(),v=gin(),w=gin();
add(u,v,w);
add(v,u,w);
}
while(m--){
int x=gin();
memset(d,0,sizeof(d));
memset(f,0,sizeof(f));
dfs(x,-1);
int d1=0,d2=0;
for(int i=head[x];i;i=e[i].ne){
int y=e[i].to;
if(f[y]>d1){
d2=d1;
d1=f[y];
}
else d2=max(d2,f[y]);
}
printf("%lld\n",d1+d2);
}
return 0;
}