wa on 1,3,4,6 求助dalao/kk
#include<bits/stdc++.h>
using namespace std;
int siz[10005],num,head[10005],q1[10005],n,m,sum,maxp[10005],rt,dis[10005],rem[10005],len,q[10005];
bool vis[10005],t[10000005],q2[10005];
struct edge{
int to,next,val;
}g[20005];
void addd(int u,int v,int w)
{
num++;
g[num].to=v;
g[num].next=head[u];
g[num].val=w;
head[u]=num;
}
void getrt(int u,int fa)
{
siz[u]=1;
maxp[u]=0;
for(int i=head[u];i;i=g[i].next)
{
int v=g[i].to;
if(v==fa||vis[v]) continue;
getrt(v,u);
siz[u]+=siz[v];
maxp[u]=max(maxp[u],siz[v]);
}
maxp[u]=max(maxp[u],sum-siz[u]);
if(maxp[u]<maxp[rt])
rt=u;
}
void getdis(int u,int fa)
{
int p=0;
if(dis[u]>1e7) return;
rem[++len]=dis[u];
for(int i=head[u];i;i=g[i].next)
{
int v=g[i].to;
if(v==fa||vis[v]) continue;
dis[v]=dis[u]+g[i].val;
getdis(v,u);
}
}
void calc(int u)
{
t[0]=vis[u]=1;
int p=0;
for(int i=head[u];i;i=g[i].next)
{
int v=g[i].to;
if(vis[v]) continue;
len=0;
dis[v]=g[i].val;
getdis(v,u);
for(int j=1;j<=len;j++)
{
for(int j1=1;j1<=m;j1++)
if(q1[j1]>=rem[j]) q2[j1]|=t[q1[j1]-rem[j]];
}
for(int j=1;j<=len;j++)
q[++p]=rem[j],t[rem[j]]=1;
}
for(int i=1;i<=p;i++)
t[q[i]]=0;
}
void slove(int u)
{
t[u]=vis[u]=1,calc(u);
for(int i=head[u];i;i=g[i].next)
{
int v=g[i].to;
if(vis[v]) continue;
sum=siz[v],maxp[rt=0]=INT_MAX;
getrt(v,u);
slove(rt);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<n;i++)
{
int u,v,w;
cin>>u>>v>>w;
addd(u,v,w);
addd(v,u,w);
}
for(int i=1;i<=m;i++)
cin>>q1[i];
maxp[rt]=sum=n;
getrt(1,0);
slove(rt);
for(int i=1;i<=m;i++)
{
if(q2[i]) cout<<"AYE"<<endl;
else
cout<<"NAY"<<endl;
}
}