zoukankan      html  css  js  c++  java
  • CF 161D Distance in Tree【树DP】

    题目大意:给一棵树,求树上两点之间距离为K的点对数目。

    方程含义:

    dp(i,j)表示从已经遍历过的点到当前点i,路径长度为 j 的路径条数。因此,对于当前点,每当遍历了其中一个儿子节点的时候,首先统计当前情况下的结果,然后要更新dp(i, j)

    初始条件dp(i,0)= 1


    #include <cstdio>
    #include <cstring>
    #include <vector>
    using namespace std;
    #define N 50005
    vector<int> g[N];
    int dp[N][505], n, k, ans;
    
    void dfs(int now, int fa) {
        for (int i=1; i<=k; i++) dp[now][i] = 0;
        dp[now][0] = 1;
    
        int u;
        for (int i=0; i<g[now].size(); i++) {
            u = g[now][i];
            if (u == fa) continue;
    
            dfs(u, now);
            for (int j=0; j<k; j++) ans += dp[u][j]*dp[now][k-j-1]; 
            for (int j=1; j<=k; j++) dp[now][j] += dp[u][j-1];   //更新当前的值
        }
    }
    int main() {
        scanf("%d%d", &n, &k);
    
        int a, b;
        for (int i=1; i<n; i++) {
            scanf("%d%d", &a, &b);
            g[a].push_back(b);
            g[b].push_back(a);
        }
    
        ans = 0;
        dfs(1, 0);
    
        printf("%d
    ", ans);
    
        return 0;
    }
    


  • 相关阅读:
    [机器人仿真软件(一)]V-REP与MATLAB进行通讯的方法
    TCP接收非法数据0xFFF4FFFD06的问题
    std::numeric_limits::epsilon
    linux 设置默认网关
    更换pip源
    实时屏幕传输
    安装node
    window 添加服务
    数据集格式
    jupyter 设置密码
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3221852.html
Copyright © 2011-2022 走看看