P3252 [JLOI2012]树

题目描述

在这个问题中,给定一个值S和一棵树。在树的每个节点有一个正整数,问有多少条路径的节点总和达到S。路径中节点的深度必须是升序的。假设节点1是根节点,根的深度是0,它的儿子节点的深度为1。路径不必一定从根节点开始。

输入格式

第一行是两个整数N和S,其中N是树的节点数。 第二行是N个正整数,第i个整数表示节点i的正整数。 接下来的N-1行每行是2个整数x和y,表示y是x的儿子。

输出格式

输出路径节点总和为S的路径数量。

简单的思路就是先构造一棵树,然后便利树,因为深度要递增,所以我们要从一个点不断的去找叶子节点。

构造树的话,我们可以用链前(链式前向星)

 1 struct  node
 2 {
 3     int w;//代表这条边的边权数值;
 4     int e;//代表以这条边为结尾的点的下标值;
 5     int next;//表示与第i条边同起点的上一条边的存储位置
 6 }ed[maxn];
 7 int head [maxn];//用来存储边的位置    
 8 int tot =0;
 9 void add (int u,int v,int w)
10     {
11       ed[++tot].w=w;//表示第i条边的权职是多少
12       ed[tot].e=v;//表示第i条边的终点
13       ed[tot].next=head[u];//head[i]表示以i为起点最后一条边的存储位置
14       head[u]=tot++;
15 }

因为这道题不涉及到权值的问题,所以我们就不作考虑。

那这道题的链前就可以写为:

 1 struct node
 2 {
 3     int u;
 4     int v;
 5 }to[100000];
 6 void add(int x,int y)
 7 {
 8     to[++tot].u=head[x];//head[i]表示以i为起点最后一条边的存储位置
 9     to[tot].v=y;//表示i条边的终点,也就是所连的节点
10     head[x]=tot;//一共所连的边数
11 }

遍历一棵树可以用dfs但是由于这道题的数据范围,海,我们还需要再加一个剪枝。

猜你喜欢

转载自www.cnblogs.com/very-beginning/p/12200444.html