题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4707
解题思路:
题目大意:
给你n个点,标号为0~n-1,还有n-1条边,数据保证n-1条边不成环,也就是说,输入的节点为n的一棵树。根节点为0,要你求深度大于d的节点的数目。
算法思想:
从根节点0开始,dfs其所有的子节点,统计深度小于等于d的节点的数目cnt,那么答案就是n-cnt。。。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v[100005];
int n,d;
int vis[100005];
void dfs(int x,int sum){
if(sum == d)
return ;
int l = v[x].size();
for(int i = 0; i < l; i++){
int tmp = v[x][i];
if(!vis[tmp]){
vis[tmp] = 1;
dfs(tmp,sum+1);
}
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&d);
int x,y;
for(int i = 0; i <= n; i++)
v[i].clear();
memset(vis,0,sizeof(vis));
for(int i = 0; i < n-1; i++){
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
vis[0] = 1;
dfs(0,0);
int ans = 0;
for(int i = 0; i < n; i++)
if(!vis[i])
ans++;
printf("%d\n",ans);
}
return 0;
}