WA on #4,6,7,8,9 qwq
调到后面思路都乱了,找不出问题。
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
inline int read(){
int x=0,f=1;
char ac=getchar();
while(ac<'0'||ac>'9'){
if(ac=='-') f=-1;
ac=getchar();
}
while(ac>='0'&&ac<='9'){
x=(x<<3)+(x<<1)+(ac-'0');
ac=getchar();
}
return x*f;
}
struct ac{
int to,sum;
}xz[50005];
bool operator <(ac a,ac b){
return a.sum<b.sum;
}
std::vector<ac> edge[50005];
int n,m,army[50005],fa[50005][20],logg[50005],dis[50005],nextneed[50005];
long long l,r,ans,dis2[50005][20],nexttim[50005];
bool p,cant[50005],need[50005];
void dfs1(int u,int f){
for(int i=1;i<=logg[dis[u]];i++){
fa[u][i]=fa[fa[u][i-1]][i-1];
dis2[u][i]=dis2[u][i-1]+dis2[fa[u][i-1]][i-1];
}
int len=edge[u].size();
for(int i=0;i<len;i++){
if(edge[u][i].to==f) continue;
fa[edge[u][i].to][0]=u;
dis2[edge[u][i].to][0]=edge[u][i].sum;
dis[edge[u][i].to]=dis[u]+1;
dfs1(edge[u][i].to,u);
}
}
bool dfs2(int u,int f){
if(cant[u]){
return 1;
}
int len=edge[u].size();
if(len==1) return 0;
for(int i=0;i<len;i++){
if(edge[u][i].to==f) continue;
if(!dfs2(edge[u][i].to,u)) return 0;
}
return 1;
}
bool check(long long x){
memset(xz,0,sizeof(xz));
memset(cant,0,sizeof(cant));
memset(need,0,sizeof(need));
memset(nexttim,0,sizeof(nexttim));
memset(nextneed,0,sizeof(nextneed));
int cnt1=0,cnt2=0,cnt3=0;
for(int i=1;i<=m;i++){
long long now=army[i],usetime=0;
for(int j=logg[dis[army[i]]];j>=0;j--){
if(fa[now][j]>1&&usetime+dis2[now][j]<=x){
now=fa[now][j];
usetime+=dis2[now][j];
}
}
if(fa[now][0]==1&&usetime+dis2[now][0]<=x){
xz[++cnt1].to=now;
xz[cnt1].sum=x-usetime-dis2[now][0];
}
else cant[now]=true;
}
/* printf("%lld\n",x);
for(int i=1;i<=cnt1;i++){
printf("%d %lld\n",xz[i].to,xz[i].sum);
}
printf("\n");*/
int len=edge[1].size();
for(int i=0;i<len;i++){
if(!dfs2(edge[1][i].to,1)) need[edge[1][i].to]=1;
}
std::sort(xz+1,xz+cnt1+1);
for(int i=1;i<=cnt1;i++){
if(need[xz[i].to]&&xz[i].sum<dis2[xz[i].to][0]) need[xz[i].to]=0;
else{
nexttim[++cnt2]=xz[i].sum;
}
}
for(int i=0;i<len;i++){
if(need[edge[1][i].to]) nextneed[++cnt3]=dis2[edge[1][i].to][0];
}
if(cnt2<cnt3) return 0;
std::sort(nexttim+1,nexttim+cnt2+1);
std::sort(nextneed+1,nextneed+cnt3+1);
/* for(int i=1;i<=cnt2;i++) printf("%lld\n",nexttim[i]);
printf("\n");
for(int i=1;i<=cnt3;i++) printf("%d\n",nextneed[i]);
printf("\n");*/
int cnt4=1;
for(int i=1;i<=cnt2;i++){
if(nexttim[i]>=nextneed[cnt4]){
cnt4++;
if(cnt4>cnt3) return 1;
}
}
return 0;
}
int main(){
n=read();
for(int i=1;i<n;i++){
int u=read(),v=read(),w=read();
edge[u].push_back((ac){v,w});
edge[v].push_back((ac){u,w});
r+=w;
}
logg[1]=0;
for(int i=2;i<=n;i++) logg[i]=logg[i>>1]+1;
dfs1(1,0);
/*for(int i=1;i<=n;i++){
for(int j=0;j<=logg[dis[i]];j++){
printf("%lld %lld\n",fa[i][j],dis2[i][j]);
}
printf("\n");
}*/
m=read();
for(int i=1;i<=m;i++){
army[i]=read();
}
while(l<=r){
long long mid=l+r>>1;
if(check(mid)){
ans=mid;
r=mid-1;
p=true;
}
else l=mid+1;
}
if(p) printf("%lld",ans);
else printf("-1");
return 0;
}