#include<bits/stdc++.h>
using namespace std;
const int N=50005,lc=log2(N)+1;
vector< pair<int,int> >E[N]; vector<int>X,R;
int army[N],power[N],belong[N],f[N][lc+105],l[N][lc+105],dep[N];bool stand[N];
int n;
void dfs1(int now,int fa,int reg,int distance)
{
//printf("now:%d fa:%d belong:%d distance:%d\n",now,fa,reg,distance);cout<<"akioinow:"<<now<<" "<<"L[2][16]:"<<l[2][16]<<endl;
f[now][0]=fa;l[now][0]=distance;dep[now]=dep[fa]+1;belong[now]=reg;//cout<<"now:"<<now<<" "<<"L[2][16]:"<<l[2][16]<<endl;
for(int i=1;i<=lc;++i)
{
//printf("Calling: node: %d lc: %d between: %d [%d->%d]:%d [%d->%d]:%d total: %d\n",now,i,f[now][i-1],now,f[now][i-1],l[now][i-1],f[now][i-1],f[f[now][i-1]][i-1],l[f[now][i-1]][i-1],l[now][i-1]+l[f[now][i-1]][i-1]);
f[now][i]=f[f[now][i-1]][i-1],l[now][i]=l[now][i-1]+l[f[now][i-1]][i-1];
}
//for(int i=1;i<=lc;++i)printf("%d ",l[now][i]); puts("");
//cout<<"now:"<<now<<" "<<"L[2][16]:"<<l[2][16]<<endl;
for(int i=0,len=E[now].size();i<len;++i)
{ //Warning:首都初始可能有军队
if(E[now][i].first!=fa)
dfs1(E[now][i].first,now,reg,E[now][i].second);
}
}
pair<int,int> find(int x,int k)
{
//cout<<"Finding: "<<"node:"<<x<<" "<<"lens:"<<k<<endl;
//for(int i=0;i<=lc;++i) printf("%d ",l[2][i]); puts("");
for(int i=lc;i>=0&&x!=1;--i)
{
if(l[x][i]<=k)/*printf("Cost: [%d] : %d->%d %d\n",i,x,f[x][i],l[x][i]),*/k-=l[x][i],x=f[x][i];
}
//cout<<"reached:"<<x<<" left:"<<k<<endl;
return make_pair(x,k);
}
bool dfs2(int now,int fa)
{ if(stand[now])return true;
// cout<<"Dfs2: "<<now<<endl;
if(E[now].size()==1) return stand[now];
for(int i=0,len=E[now].size();i<len;++i)
{
if(E[now][i].first!=fa)
if(!dfs2(E[now][i].first,now))return false;
}
return stand[now]=true;
}
bool check(int x)
{
memset(stand,0,sizeof(stand));
R.clear();X.clear();
// printf("Time limited : %d\n",x);
for(int i=1;i<=n;++i)
{
if(!army[i])continue;
pair<int,int> ri=find(i,x);
if(ri.first==1)
{int fi=0;
if(ri.second<l[belong[i]][0]) stand[belong[i]]=1,fi=-1;
// printf(" For army #%d reached 1 time left %d\n",i,ri.second);
for(int j=1;j<=army[i]+fi;++j)R.push_back(ri.second);
}
else /*printf(" For army #%d reached ri.first time left 0\n",ri.first),*/stand[ri.first]=1;
}
//for(int i=1;i<=n;++i)printf("%d ",stand[i]); puts("");
dfs2(1,1);//for(int i=1;i<=n;++i)printf("%d ",stand[i]); puts("");
for(int i=0,len=E[1].size();i<len;++i)
{
if(!stand[E[1][i].first])/*printf("No standing: %d\n",E[1][i].first ),*/X.push_back(E[1][i].second);
//else printf("standing: %d\n",E[1][i].first);
}
sort(R.begin(),R.end()); sort(X.begin(),X.end()); int l=0;
for(int i=0,len=X.size();i<len;++i)
{
while(l<(signed)R.size()&&R[l]<X[i])++l;
if(l==(signed)R.size())return false;
++l;
}
return true;
}
int main()
{
// freopen("P1084.in","r",stdin);
// freopen("newbie.out","w",stdout);
power[0]=1; int r=0;
for(int i=1;i<=lc;++i)power[i]=power[i-1]<<1;
cin>>n;
if(n==1)
{
puts("0");
return 0;
}
for(int i=1;i<=n-1;++i)
{
int u,v,w;
cin>>u>>v>>w;
E[u].push_back(make_pair(v,w));
E[v].push_back(make_pair(u,w));r+=w;
}
int m;
cin>>m;
for(int i=1;i<=m;++i)
{
int t;
cin>>t;
++army[t];
}
for(int i=0;i<=lc;++i)f[1][i]=1;
belong[1]=1;
for(int i=0,len=E[1].size();i<len;++i)f[E[1][i].first][0]=1,dfs1(E[1][i].first,1,E[1][i].first,E[1][i].second);
//printf("SB: %d %d %d\n",l[2][0], l[2][1],l[2][2]);
int l=0,ans=2100000000;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))ans=mid,r=mid-1;
else l=mid+1;
}
if(ans==111111111) ans=-1;
printf("%d\n",ans);
return 0;
}
现有hack都过了,然而数据只有70分
bug自动机