HDU 4707 Pet(DFS:树深度相关)

HDU 4707 Pet(DFS:树深度相关)

http://acm.hdu.edu.cn/showproblem.php?pid=4707

题目描述:

        给出一个具有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的节点数即可。本题采用的就是不走连接父节点边的策略判重。否则就需要一个vis数组来判重。

AC代码:

#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;
}



你可能感兴趣的:(Algorithm,算法,ACM,DFS)