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
原文地址:https://www.cnblogs.com/crackpotisback/p/4842343.html