1 条题解

  • 0
    @ 2025-8-24 21:46:59

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 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;
    }
    
    

    By{\color{Gold}By}

    enceladsu{\color{Gold}enceladsu}

    • 1

    信息

    ID
    2325
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者