1 条题解
-
0
自动搬运
来自洛谷,原作者为

enceladus
?搬运于
2025-08-24 21:46:59,当前版本为作者最后更新于2018-09-04 10:43:40,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题解里好像只有从根深搜的,~~从根搜索太复杂蒟蒻我看不懂啊。~~那我来水一篇暴力QAQ。
%下面大佬,用LCA等复杂方法过的
先让我们看这句话
路径中节点的深度必须是升序的。
那就要保证是向下搜的呗。
用链式前向星存边,记录父亲, 只要保证下个节点不是他的父亲即可
读入时
for(int i=1;i<=n-1;i++) { cin>>x>>y; add(x,y); fa[y]=x; }搜索时
if(fa[x]!=nxt)
再看这句话
路径不必一定从根节点开始。
那就把点全枚举一边就行啊,
for(int i=1;i<=n;i++) { dfs(i,w[i]); }
问有多少条路径的节点总和达到S
当时本人不太明白的,是要到s才行,不能超过s。所以可以加入剪枝
超过s就不用搜了qwq。 达到s后ans++,不用搜了
if(dis>s) return; if(dis==s) { ans++; return; }
下面献上简陋的代码
不要抄袭,代码有锅QAQ
#include<iostream> #include<cstdio> #include<algorithm> #define ll long long #define IL inline #define R register using namespace std; struct node{ int u,v; }fuck[100007]; int head[100007],fa[100007],x,y,w[100007],n,s,tot=0,ans=0; IL void read(int &x) { int f=1;x=0;char s=getchar(); while (s<'0'||s>'9'){if(s=='-') f=-1 s=getchar();} while (s>='0'&&s<='9'){ x=x*10+s-'0'; s=getchar();} x*=f; } void add(int x,int y) { fuck[++tot].u=head[x];//++? fuck[tot].v=y; head[x]=tot; } IL void dfs(int x,int dis) { if(dis>s) return; if(dis==s) { ans++; return; } for(int i=head[x];i;i=fuck[i].u) { int nxt=fuck[i].v; if(fa[x]!=nxt) dfs(nxt,dis+w[nxt]); } } int main() { read(n);read(s); for(int i=1;i<=n;i++) cin>>w[i]; for(int i=1;i<=n-1;i++) { cin>>x>>y; add(x,y); fa[y]=x; } for(int i=1;i<=n;i++) { dfs(i,w[i]); } cout<<ans<<endl; return 0; }
- 1
信息
- ID
- 2325
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者