codeforces 682C Alyona and the Tree(DFS)
题目链接:http://codeforces.com/problemset/problem/682/C
题意:如果点v在点u的子树上且dist(u,v)>a[v]则u和其整个子树都将被删去,求被删去的点数。
思路:1为根节点,从1开始DFS遍历,记录距离dis为到祖宗节点的最大距离。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+5; int a[N],num[N],ans; ll edge[N]; vector<int> G[N]; void dfs1(int x) { if(G[x].size()==0) { num[x]=1; return; } for(int i=0;i<G[x].size();i++) { dfs1(G[x][i]); num[x]+=num[G[x][i]]; } num[x]++; } void dfs(int x,ll dis) { if(dis>a[x]) { ans+=num[x]; return; } for(int i=0;i<G[x].size();i++) dfs(G[x][i],max(dis+edge[G[x][i]],edge[G[x][i]]));//最大距离 } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",a+i); for(int i=1;i<n;i++) { int v; scanf("%d%I64d",&v,&edge[i+1]); G[v].push_back(i+1); } dfs1(1); dfs(1,0); printf("%d\n",ans); return 0; }