HDU4707
题目描述:给出一个具有N(0<N<=100000)个节点的树(节点编号从0到N-1),然后给出一个距离D(0<D<N),求出距离0号节点的距离大于D的节点个数。树中相邻节点的距离为1。
输入:首先是一个T(0<T<=10),表实例个数。对于每个实例,首先是一行N和D,然后是N-1行(X,Y),表示树的每条边。
输出:输出距离0号节点距离大于D的节点总数。
分析:从0号节点开始做一次DFS,记录距离大于D的节点数即可。
#include<cstdio>
#include<vector>
using namespace std;
const int maxn=100000+100;
vector<int> G[maxn];
int sum,n,d;
void dfs(int i,int dep,int fa)
{
if(dep>d) sum++;
int m=G[i].size();
for(int j=0;j<m;j++)if(fa!=G[i][j])
dfs(G[i][j],dep+1,i);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
sum=0;
scanf("%d %d",&n,&d);
for(int i=0;i<n;i++)
G[i].clear();
for(int i=0;i<n-1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
dfs(0,0,-1);
printf("%d\n",sum);
}
return 0;
}