loj75,洛谷90,求大佬查错
#include<bits/stdc++.h>
using namespace std;
int cnt=0,n,m,pd=0,cnt_w=0,cnt_c=0,num=0;
int head[600010]={0},army[300100]={0},grand[300100][21]={0},who[300100]={0};
int mark[300100]={0},jl[300100]={0},used[300100]={0},slove[300100]={0},city_can[300100],city_will[300100];
long long deep[300100]={0},l=0,r=0,ans=0;
struct node{
int to,next,val;
}tu[600100];
inline bool cmp(int x,int y){
return deep[x]>deep[y];
}
inline void add(int u,int v,int c){
cnt++;
tu[cnt].to=v;
tu[cnt].val=c;
tu[cnt].next=head[u];
head[u]=cnt;
}
void pre_dfs(int x,int fa,int kk){
r=max(r,deep[x]);
who[x]=kk;
for(int i=1;i<=19;i++) grand[x][i]=grand[ grand[x][i-1] ][i-1];
for(int i=head[x];i;i=tu[i].next){
if(tu[i].to==fa) continue;
deep[tu[i].to]=deep[x]+tu[i].val;
grand[tu[i].to][0]=x;
pre_dfs(tu[i].to,x,kk);
}
}
bool re_dfs(int x,int fa){
if(mark[x]) return 1;
for(int i=head[x];i;i=tu[i].next){
if(tu[i].to==fa) continue;
if(!re_dfs(tu[i].to,x)) return 0;
}
if(!tu[head[x]].next) return 0;
return 1;
}
bool check(long long limit){
cnt_w=cnt_c=0;
memset(mark,0,sizeof(mark));
memset(jl,0,sizeof(jl));
memset(used,0,sizeof(used));
for(int i=1;i<=m;i++){
int xx=army[i];
if(deep[xx]>limit){
for(int j=19;j>=0;j--)
if(grand[xx][j]>1&&deep[xx]-deep[grand[xx][j]]<=limit)
xx=grand[xx][j];
mark[xx]=1;
}
else{
cnt_c++;
city_can[cnt_c]=i;
if(!jl[who[xx]]||deep[xx]>deep[ army[jl[who[xx]]] ])
jl[who[xx]]=i;
}
}
for(int i=1;i<=num;i++){
if(!re_dfs(slove[i],1)) {
cnt_w++;
city_will[cnt_w]=slove[i];
}
}
// if(limit==28132){
// cout<<endl;
// for(int i=1;i<=cnt_c;i++) cout<<deep[army[city_can[i]]]<<" ";
// cout<<endl;
// for(int i=1;i<=cnt_w;i++) cout<<deep[city_will[i]]<<" ";
// }
if(!cnt_w) return 1;
if(cnt_c<cnt_w) return 0;
used[0]=1;
for(int i=1;i<=cnt_w;i++){
if( !used[ jl[ city_will[i] ] ] ){
used[ jl[ city_will[i] ] ]=1;
continue;
}
while(cnt_c&&used[city_can[cnt_c]]) cnt_c--;
if(!cnt_c) return 0;
if(limit-deep[ army[ city_can[cnt_c] ] ]<deep[ city_will[i] ]) return 0;
used[city_can[cnt_c]]=1;
}
return 1;
}
int main(){
freopen("blockade.in","r",stdin);
freopen("blockade.out","w",stdout);
cin>>n;
for(int i=1,a,b,c;i<n;i++){
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
}
for(int i=head[1];i;i=tu[i].next){
deep[tu[i].to]=tu[i].val;
grand[tu[i].to][0]=1;
num++;
slove[num]=tu[i].to;
pre_dfs(tu[i].to,1,tu[i].to);
}
cin>>m;
if(m<slove[0]){ cout<<-1; return 0;}
for(int i=1;i<=m;i++) cin>>army[i];
sort(army+1,army+1+m,cmp);
sort(slove+1,slove+1+num,cmp);
r*=2;
while(l<=r){
long long mid=(l+r)>>1;
if(check(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
cout<<ans;
return 0;
}