zoukankan      html  css  js  c++  java
  • CodeForces 161D Distance in Tree

    Distance in Tree

    Time Limit: 3000ms
    Memory Limit: 524288KB
    This problem will be judged on CodeForces. Original ID: 161D
    64-bit integer IO format: %I64d      Java class name: (Any)
     

    tree is a connected graph that doesn't contain any cycles.

    The distance between two vertices of a tree is the length (in edges) of the shortest path between these vertices.

    You are given a tree with n vertices and a positive number k. Find the number of distinct pairs of the vertices which have a distance of exactly k between them. Note that pairs (v,u) and (uv) are considered to be the same pair.

     

    Input


    The first line contains two integers n and k (1 ≤ n ≤ 50000, 1 ≤ k ≤ 500) — the number of vertices and the required distance between the vertices.

    Next n - 1 lines describe the edges as "ai bi" (without the quotes) (1 ≤ ai, bi ≤ nai ≠ bi), where ai and bi are the vertices connected by the i-th edge. All given edges are different.

     

    Output


    Print a single integer — the number of distinct pairs of the tree's vertices which have a distance of exactly k between them.

    Please do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.

     

    Sample Input


    Input
    5 2
    1 2
    2 3
    3 4
    2 5
    Output
    4
    Input
    5 3
    1 2
    2 3
    3 4
    4 5
    Output
    2

    Hint

    In the first sample the pairs of vertexes at distance 2 from each other are (1, 3), (1, 5), (3, 5) and (2, 4).

     

    Source

     
    解题:树形dp dp[u][i]表示从子树到u为根长度为i的路径数目
     
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 50010;
     4 vector<int>g[maxn];
     5 int dp[maxn][505],n,k,ret;
     6 void dfs(int u,int fa){
     7     for(int i = 1; i <= k; ++i) dp[u][i] = 0;
     8     dp[u][0] = 1;
     9     for(int i = g[u].size()-1; i >= 0; --i){
    10         if(g[u][i] == fa) continue;
    11         dfs(g[u][i],u);
    12         for(int j = 0; j < k; ++j) ret += dp[u][j]*dp[g[u][i]][k - j - 1];
    13         for(int j = 1; j <= k; ++j) dp[u][j] += dp[g[u][i]][j-1];
    14     }
    15 }
    16 int main(){
    17     int u,v;
    18     while(~scanf("%d%d",&n,&k)){
    19         for(int i = ret = 0; i < maxn; ++i) g[i].clear();
    20         for(int i = 1; i < n; ++i){
    21             scanf("%d%d",&u,&v);
    22             g[u].push_back(v);
    23             g[v].push_back(u);
    24         }
    25         dfs(1,0);
    26         printf("%d
    ",ret);
    27     }
    28     return 0;
    29 }
    View Code
  • 相关阅读:
    Python Data Analysis Library¶
    matadon/mizuno
    MySQL 5.1参考手册
    Apache Derby: Quick Start
    JRuby大捷:ThoughtWorks宣布Mingle发布在即
    RailsWithH2InJNDIOnJetty
    Embedded Jetty and Spring: The Lightweight Antidote for Java EE Complexity
    window下安装解压缩版mysql/zip压缩文件包非install安装程序
    Chapter 9. Extending Workbench
    Mysql手动增加一列_Blog of Grow_百度空间
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4842343.html
Copyright © 2011-2022 走看看