问题描述:
在这个问题中,给定一个值S和一棵树。在树的每个节点有一个正整数,问有多少条路径的节点总和达到S。路径中节点的深度必须是升序的。假设节点1是根节点,根的深度是0,它的儿子节点的深度为1。路径不必一定从根节点开始。
输入格式:
第一行是两个整数N和S,其中N是树的节点数。
第二行是N个正整数,第i个整数表示节点i的正整数。
接下来的N-1行每行是2个整数x和y,表示y是x的儿子。
输出格式:
输出路径节点总和为S的路径数量。
输入样例: | 输出样例: |
3 3 1 2 3 1 2 1 3 | 2 |
数据范围:
对于30%数据,N≤100;
对于60%数据,N≤1000;
对于100%数据,N≤100000,所有权值以及S都不超过1000。
这题好蛋疼!!很简单的搜索,却想复杂了。。解法很简单,从叶节点开始枚举知道根节点,假设如果他算入其中,则从他向上加,超过sum退出,等于sum则答案+1
var
ans,n,m,i,j,x,y:longint;
a:array[0..100001] of longint;
f:array[0..100001] of longint;
function k(x,b:longint):longint;
begin
if b=m then exit(1);
if b>m then exit(0);
if f[x]=0 then exit(0);
exit(k(f[x],b+a[f[x]]));
end;
begin
readln(n,m);
for i:=1 to n do read(a[i]);
readln;
for i:=1 to n-1 do begin
readln(x,y);
f[y]:=x;
end;
for i:=1 to n do inc(ans,k(i,a[i]));
writeln(ans);
end.