P3252 [JLOI2012]树
题目描述
在这个问题中,给定一个值S和一棵树。在树的每个节点有一个正整数,问有多少条路径的节点总和达到S。路径中节点的深度必须是升序的。假设节点1是根节点,根的深度是0,它的儿子节点的深度为1。路径不必一定从根节点开始。
输入格式
第一行是两个整数N和S,其中N是树的节点数。 第二行是N个正整数,第i个整数表示节点i的正整数。 接下来的N-1行每行是2个整数x和y,表示y是x的儿子。
输出格式
输出路径节点总和为S的路径数量。
简单的思路就是先构造一棵树,然后便利树,因为深度要递增,所以我们要从一个点不断的去找叶子节点。
链式 前向星存图
struct node
{
int w;//代表这条边的边权数值;
int e;//代表以这条边为结尾的点的下标值;
int next;//表示与第i条边同起点的上一条边的存储位置
}ed[maxn];
int head [maxn];//用来存储边的位置
int tot =;
void add (int u,int v,int w)
{
ed[++tot].w=w;//表示第i条边的权职是多少
ed[tot].e=v;//表示第i条边的终点
ed[tot].next=head[u];//head[i]表示以i为起点最后一条边的存储位置
head[u]=tot++;
}
因为这道题不涉及到权值的问题,所以我们就不作考虑。
那这道题的链前就可以写为:
struct node
{
int u;
int v;
}to[];
void add(int x,int y)
{
to[++tot].u=head[x];//head[i]表示以i为起点最后一条边的存储位置
to[tot].v=y;//表示i条边的终点,也就是所连的节点
head[x]=tot;//一共所连的边数
}
遍历一棵树可以用dfs但是由于这道题的数据范围,我们还需要再加一个剪枝。
如果当前节点和已经超过s,我们就不需要继续往下搜索了。
搜索的时候,深度需要升序,我们只能往下找当前节点的子节点。
但是这样还不够,就即使加了剪枝依然会t掉4个点,所以我加了一个小小的读入优化,就神奇的过辽!
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[];
int st,ed;
int read()
{
int x = ,a = ;
char ch = getchar();
while(ch < '' || ch > ''){
if(ch == '-')x = -;
ch = getchar();
}
while(ch <= ''&&ch >= ''){
a = a * + ch - '';
ch = getchar();
}
return x*a;
}
struct node
{
int u;
int v;
}to[];
int fa[],head[],x,y,n,s,tot=,ans=;
void add(int x,int y)
{
to[++tot].u=head[x];
to[tot].v=y;
head[x]=tot;
}
void dfs(int x,int dis)
{
if (dis>s)
return;
if (dis==s)
{
ans++;
return;
}
for (int i = head[x];i>;i=to[i].u)
{
int nxt=to[i].v;
if (fa[x]!=nxt)
dfs(nxt,dis+a[nxt]);
}
}
int main()
{
n = read();
s = read();
memset(head, -, sizeof(head));
for (int i = ;i <= n;i++)
{
a[i] = read();
fa[a[i]]=a[i];
}
for (int i = ;i <= n-;i++)
{
st=read();
ed=read();
add(st,ed);
fa[ed]=st;
}
for (int i = ;i <= n;i++)
{
dfs(i,a[i]);
}
cout<<ans<<endl;
return ;
}
P3252 [JLOI2012]树的更多相关文章
- 洛谷——P3252 [JLOI2012]树
P3252 [JLOI2012]树 题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度 ...
- 洛谷 P3252 [JLOI2012]树
P3252 [JLOI2012]树 题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度 ...
- 洛谷P3252 [JLOI2012]树
题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深度为1.路径不 ...
- 题解 P3252 【[JLOI2012]树】
\(\Huge{[JLOI2012]树}\) 题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点 ...
- BZOJ2783: [JLOI2012]树 dfs+set
2783: [JLOI2012]树 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 588 Solved: 347 Description 数列 提交文 ...
- 2783: [JLOI2012]树( dfs + BST )
直接DFS, 然后用set维护一下就好了.... O(nlogn) ------------------------------------------------------------------ ...
- 【BZOJ2783】[JLOI2012]树 DFS+栈+队列
[BZOJ2783][JLOI2012]树 Description 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节 ...
- BZOJ2783: [JLOI2012]树
Description 数列 提交文件:sequence.pas/c/cpp 输入文件:sequence.in 输出文件:sequence.out 问题描述: 把一个正整数分成一列连续的正整数之和.这 ...
- BZOJ2783: [JLOI2012]树(树上前缀和+set)
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1215 Solved: 768[Submit][Status][Discuss] Descriptio ...
随机推荐
- 在远程服务器上执行本地的shell脚本
在远程服务器上执行本地的shell脚本 [root@localhost zzx]# sh echoip.sh 192.168.67.131[root@localhost zzx]# ssh root@ ...
- hadoop解决windows下:Failed to set permissions of path: \tmp\ \.staging to 0700
17/04/24 15:32:44 WARN util.NativeCodeLoader: Unable to load native-Hadoop library for your platform ...
- maven手动安装ojdbc6.jar包到本地仓库
需要jar文件 ojdbc6.jar jar下载地址1 下载地址2 本地执行: mvn install:install-file -Dfile=D:/ojdbc6.jar -DgroupId=co ...
- 049-PHP输出当前文件的名称
<?php echo __FILE__; //利用常量__FILE__输出当前文件的名称 ?>
- Spring配置数据源的三种方法
前言:今天接触新项目发现用的是JNDI配置数据源,用度娘倒腾了一会也没弄好,只好用平常用的方法,结果发现BasicDataSource和DriverManagerDataSource也是不同的,所以记 ...
- Sklearn 预处理数据
## 版权所有,转帖注明出处 章节 SciKit-Learn 加载数据集 SciKit-Learn 数据集基本信息 SciKit-Learn 使用matplotlib可视化数据 SciKit-Lear ...
- spring教程
Spring框架是Java EE开发中最流行的框架,已经成为JEE事实上的标准,全世界的开发人员都在使用Spring框架开发各种应用.随着Spring boot,Spring cloud新版本的不断推 ...
- ACM-奇特的立方体
题目描述:奇特的立方体 任意给出8个整数,将这8个整数分别放在一个立方体的八个顶点上,要求检验每个面上的四个数之和相等这个条件能否被满足. 输入 一次输入8个整数 输出 YES或者NO YES表示可能 ...
- 第一部分 JavaScript语言核心(三)
第六章 对象 P123 在ES3中,点运算符后的标识符不能是保留字.如果一个对象的属性名是保留字,name必须使用方括号的形式访问它们,如o["for"]和o["clas ...
- LightOJ - 1282 Leading and Trailing (数论)
题意:求nk的前三位和后三位. 分析: 1.后三位快速幂取模,注意不足三位补前导零. 补前导零:假如nk为1234005,快速幂取模后,得到的数是5,因此输出要补前导零. 2.前三位: 令n=10a, ...