题意:
建立一棵树,每个节点有对应的价值,和花费。
价值小于等于话费,才合理,否则删掉。
问这棵树最后有多少节点。
题意:
用邻接表,
然后用深搜从根节点1 往下遍历。如果sum<=v[u];即可行;
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=100000+100;
struct Edge{
int v,w,nxt;
}edge[maxn<<1];
int head[maxn],cnt,ans;
int val[maxn];
void dfs(int u,int cn,ll sum){
if(sum<=val[u]) ans++;
else return ;
for(int i=head[u];i!=-1;i=edge[i].nxt){
int v=edge[i].v;
if(cn!=v){
ll t=sum-edge[i].w;
dfs(v,u,max(t,(ll)val[v]));
}
}
}
int main(){
int T,n,u,v,w;
scanf("%d",&T);
while(T--){
cnt=0,ans=0;
memset(head,-1,sizeof(head));
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d%d%d",&u,&v,&w);
edge[cnt].v=v;edge[cnt].w=w;edge[cnt].nxt=head[u];head[u]=cnt++;
edge[cnt].v=u;edge[cnt].w=w;edge[cnt].nxt=head[v];head[v]=cnt++;
}
for(int i=1;i<=n;i++)
scanf("%d",&val[i]);
dfs(1,-1,val[1]);
printf("%d\n",ans);
}
return 0;
}