• 【CF486D】有效集合-树形dp


    Problem 有效集合

    题目大意

    给出一棵树,求出这棵树的不同联通子节点集合的数量,这些集合必须满足最大权值点减最小权值点小于等于d。

    Solution

    再一次树d乱搞。

    因为数据范围贼小,所以我们对于每一个点为根的情况进行一次dfs.

    对于以节点root为根的情况,我们认为root是最小值。

    对于root的某一棵子树,其需要算的情况一定包含root,否则前面已经算过了。

    于是我们就对这个root进行dfs。dfs过程中,我们始终保证root为最小值,不遍历大于它的点。

    因为有了这个性质,我们只要不走加起来大于d的点,接下来所有的点都不属于被计算范围内,可以不走。

    在这个以root为根的树中,现在我们遍历到u,选中它的一颗子树v。

    对于这一串东西上,我们每次可以选择以前已遍历过的子树中选择某些点,再从v该棵子树下选择某些点组成新情况。

    我们增加的情况是已经遍历过的子树答案*(该子树被遍历到的子树总答案+1)

    加一是因为空集也算是一种情况。

    也就是f[u]*=f[v]+1;

    对于每个叶子结点,我们只需要将f设为1即可。

    dfs完以后,我们将以每个点为根(最小值)的情况进行累加。

    于是最终的ans便是答案。

    需要注意的是,这一道题MOD1000000007

    所以f数组、ans变量需要long long类型

    而我一直爆炸,因为没注意到,dfs函数也要为long long类型。

    所以请注意这个问题。

    AC Code

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define MOD 1000000007
    using namespace std;
    struct node{
        int to,next;
    }e[4010];
    int d,n,u,v,h[2010],a[2010],tot=0;
    long long f[2010],ans=0;
    void add(int u,int v){
        e[++tot].to=u;e[tot].next=h[v];h[v]=tot;
        e[++tot].to=v;e[tot].next=h[u];h[u]=tot;
    }
    long long dfs(int x,int last,int root){
        long long ans=1;
        f[x]=1;
        for(int i=h[x];~i;i=e[i].next){
            if(last!=e[i].to&&(a[e[i].to]>a[root]||(a[e[i].to]==a[root]&&root>e[i].to))
            &&a[e[i].to]-a[root]<=d){
                ans=(ans*(dfs(e[i].to,x,root)+1)%MOD)%MOD;
            }
        }
        return ans;
    }
    int main(){
    //  freopen("cf486d.in","r",stdin);
        memset(h,-1,sizeof(h));
        scanf("%d%d",&d,&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        for(int i=1;i<n;i++){
            scanf("%d%d",&u,&v);
            add(u,v);
        }
        for(int i=1;i<=n;i++)ans+=dfs(i,0,i);
        printf("%lld",ans%MOD);
    }
  • 相关阅读:
    js+canvas画随机4位验证码
    linux 下 查看 nginx 日志中访问前10 的 ip
    mysql greatest函数
    php 如何获取 post 传递的raw 数据
    php 监控文件变化 并上传到服务器
    php 如何统计本周 本月
    Yii2.0 GridView 的强大功能
    git 导出新修改的文件
    ubuntu16.04 下安装phpMyAdmin
    如何在ubuntu16.04 上搭建 phpstorm + xdebug 调试
  • 原文地址:https://www.cnblogs.com/skylynf/p/7143389.html
Copyright © 2020-2023  润新知