#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<bitset>
using namespace std;
struct data
{
int l;
long long w;
};
data k,need[50005];
vector <data> city[1005];
int n,m,a,b,ans,kk,cnt;
int tt,ff;
long long c,mid,l=1,r;
long long lt[50005],send[50005];
int zz[50005],army[50005],dis[50005][20],f[50005][20];
int dep[50005],stay[50005],one[50005],g[50005][2],sec[50005];
bool vis[50005],vis2[50005],p[50005];
bool comp(data x,data y)
{
if (x.w>=y.w) return true;
return false;
}
bool comp2(int x,int y)
{
if (x>=y) return true;
return false;
}
void dfs(int x)
{
vis[x]=true;
for (int i=0;i<city[x].size();i++)
if (!vis[city[x][i].l])
{
dep[city[x][i].l]=dep[x]+1;
dis[city[x][i].l][0]=city[x][i].w;
f[city[x][i].l][0]=x;
dfs(city[x][i].l);
}
}
void init()
{//here
for (int j=1;(1<<j)<=n;j++)
for(int i=1;i<=n;i++)
{
f[i][j]=f[f[i][j-1]][j-1];
dis[i][j]=dis[f[i][j-1]][j-1]+dis[i][j-1];
}
}
void up(int x,int s)
{
for (int i=0;dis[x][i]<=lt[s];i++)
{
p[x]=false;
x=f[x][i];
p[x]=true;
army[s]=x;
lt[s]-=dis[x][i];
if (lt[s]<lt[stay[x]]) stay[x]=s;
if (dep[x]==2) return ;
}
return ;
}
int dfs2(int x)
{
int s=0;
vis2[x]=true;
for (int i=0;i<city[x].size();i++)
if (!vis2[city[x][i].l])
{
dfs2(city[x][i].l);
if (p[city[x][i].l]==false) break;
else s++;
}
if (s==city[x].size()){p[x]=true;return 2;}
if (p[x]==true) return 1;
return 0;
}
int ss()
{
if (ff<tt) return 0;
sort(need+1,need+1+tt,comp);
sort(send+1,send+1+ff,comp2);
for (int i=1;i<=tt;i++)
if (need[i].w>send[i]) return 1;
return 0;
}
int check()
{
tt=0,ff=0;
vis2[1]=true;
for (int i=0;i<city[1].size();i++)
{
int t=dfs2(city[1][i].l);
one[city[1][i].l]=t;
if (t==0){
need[++tt].l=city[1][i].l;
need[tt].w=city[1][i].w;
}
}
for (int i=1;i<=m;i++)
if (dep[army[i]]==2)
{
if (one[army[i]]==1&&stay[army[i]]!=i)
{
if (lt[i]-g[i][0]>=0)
{
lt[i]-=g[i][0];
send[++ff]=lt[i];
}
}
if (one[army[i]]==2&<[i]-g[i][0]>=0)
{
lt[i]-=g[i][0];
send[++ff]=lt[i];
}
}
return ss();
}
int main()
{
freopen ("blockade.in","r",stdin);
//freopen ("blockade.out","w",stdout);
scanf ("%d",&n);
for (int i=1;i<=n-1;i++)
{
scanf ("%d%d%lld",&a,&b,&c);
k.l=b;k.w=c;city[a].push_back(k);
k.l=a;k.w=c;city[b].push_back(k);
r+=c;
if (a==1||b==1) kk++;
}
scanf ("%d",&m);
if (m<kk){printf ("-1");return 0;}
for (int i=1;i<=m;i++)
{
scanf ("%d",&a);
zz[++cnt]=a;
army[cnt]=a;
p[a]=true;
}
vis[1]=true;
for (int i=0;i<city[1].size();i++)
{
g[city[1][i].l][0]=city[1][i].w;
f[city[1][i].l][0]=city[1][i].l;
dep[city[1][i].l]=2;
dfs(city[1][i].l);
}
init();//here
lt[0]=1e14;
while (l<r)
{
mid=(l+r)>>1;
for (int i=1;i<=cnt;i++)
{
lt[zz[i]]=mid;
up(zz[i],i);
}
if (check()) l=mid+1;//and here
else r=mid;
}
printf ("%d",r);
return 0;
}
NOIP 2012 Day2 T3 疫情控制
最新推荐文章于 2019-10-17 21:02:04 发布