zoukankan      html  css  js  c++  java
  • 树形DP 统计树中长度为K的路径数量——Distance in Tree

    一、问题描述

    给出一棵n个节点的树,统计树中长度为k的路径的条数(1<=n<=50000 , 1<=k<=500)。

    二、解题思路

    设d[i][k]表示以i为根节点长度为k的路径数目

    三、代码实现

     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<vector>
     6 using namespace std;
     7 
     8 const int maxn = 50000 + 10;
     9 const int maxk = 500 + 10;
    10 vector<int>G[maxn];
    11 int d[maxn][maxk],ans;
    12 int n;
    13 
    14 void init()
    15 {
    16     ans = 0;
    17     memset(d, 0, sizeof(d));
    18     for (int i = 0; i <= n; i++)    G[i].clear();
    19 }
    20 
    21 void dfs(int root, int fa, int k)
    22 {
    23     d[root][0] = 1;
    24     for (int i = 0; i < (int)G[root].size(); i++)
    25     {
    26         int son = G[root][i];
    27         if (son == fa)  continue;        //无向图,注意保持dfs的方向
    28         dfs(son, root, k);
    29         for (int j = 0; j < k; j++)  ans += d[son][j] * d[root][k - 1 - j];
    30         for (int j = 1; j <= k; j++)    d[root][j] += d[son][j - 1];
    31     }
    32 }
    33 
    34 
    35 int main()
    36 {
    37     int k;
    38     while (scanf("%d%d",&n,&k) == 2)
    39     {
    40         int a, b;
    41         init();
    42         for (int i = 0; i < n - 1; i++)
    43         {
    44             scanf("%d%d", &a, &b);
    45             G[a].push_back(b);
    46             G[b].push_back(a);
    47         }
    48         dfs(1, 0, k);
    49         printf("%d
    ", ans);
    50     }
    51     return 0;
    52 }
  • 相关阅读:
    DUILib的代码分析
    source$表坏块
    树莓派风扇自动控制随想
    给qq机器人加上bing搜索
    龙芯fedora28日常生存指南
    攻防世界 when_did_you_born
    部署PWN题Docker环境
    NPUCTF2020 EzRSA
    金融密码杯 The Art of War
    Machine Learning & Deep Learning Fundamentals
  • 原文地址:https://www.cnblogs.com/lfri/p/9486561.html
Copyright © 2011-2022 走看看