处理假了,还有一坨跟着东西写错![](//图.tk/7),放下条好的代码:
```cpp
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+10;
struct edge{
int to,w;
bool operator<(const edge& x)const{return w<x.w;}
};
int n,m,a[N],f[N][17],d[N][17],dep[N];
bool b[N],c[N];
vector<edge>e[N];
vector<edge>q;vector<int>o,p;
void dfs(int u){
dep[u]=dep[f[u][0]]+1;
for(int i=1;i<=16;i++)f[u][i]=f[f[u][i-1]][i-1];
for(int i=1;i<=16;i++)d[u][i]=d[u][i-1]+d[f[u][i-1]][i-1];
for(auto x:e[u]){
int v=x.to,l=x.w;
if(v!=f[u][0])f[v][0]=u,d[v][0]=l,dfs(v);
}
return;
}
bool DFS(int u){
if(b[u])return 0;
bool son=1;
for(auto x:e[u]){
int v=x.to;
if(v==f[u][0])continue;
son=0;if(DFS(v))return 1;
}
if(son)return 1;
return 0;
}
bool check(int tim){
q.clear();o.clear();p.clear();
for(int i=1;i<=n;i++)b[i]=0,c[i]=0;
for(int i=1;i<=m;i++){
int k=a[i],dis=0;
for(int j=16;j>=0;j--)
if(f[k][j]>1&&dis+d[k][j]<=tim)dis+=d[k][j],k=f[k][j];
if(f[k][0]==1&&dis+d[k][0]<tim)q.push_back({k,tim-dis-d[k][0]});
else b[k]=1;
}
sort(q.begin(),q.end());
for(auto x:e[1])c[x.to]=DFS(x.to);
for(int i=0;i<q.size();i++)
if(c[q[i].to]&&q[i].w<d[q[i].to][0])c[q[i].to]=0;else o.push_back(q[i].w);
for(auto x:e[1])if(c[x.to])p.push_back(x.w);
if(o.size()<p.size())return 0;
sort(o.begin(),o.end());sort(p.begin(),p.end());
int l=0,r=0;
while(l<o.size()&&r<p.size())if(o[l]<p[r])l++;else l++,r++;
if(r==p.size())return 1;
return 0;
}
int Search(int l,int r){
if(l>=r)return l;
int mid=l+r>>1;
if(check(mid))return Search(l,mid);
else return Search(mid+1,r);
}
signed main(){
//freopen("flu.in","r",stdin);
//freopen("flu.out","w",stdout);
scanf("%d",&n);
for(int i=1,x,y,z;i<n;i++){
scanf("%d%d%d",&x,&y,&z);
e[x].push_back({y,z});e[y].push_back({x,z});
}
scanf("%d",&m);
for(int i=1;i<=m;i++)scanf("%d",&a[i]);
dfs(1);
if(!check(1e9))puts("-1");
else printf("%d\n",Search(1,1e9));
system("pause");
return 0;
}
```
by ACRUSHj @ 2023-07-25 09:11:47