爆刷PAT(甲级)——之【1004】 Counting Leaves (30)——树上简单dfs搜索

艰难的英语单词:

pedigree     英 [ˈpedɪgri:]      血统; 家谱
sake         英 [seɪk]    缘故, 目的
hence         英 [hens]    因此,所以

题意: 给一棵树,然后输出这颗树每一层的叶子节点数。

难点:N小于100。而且节点标记从1开始,根节点就是1,所以说难点就是如何统计出每一层的叶子数即可。

简单的想了一下,用DFS好像不是很难,写了一下一遍AC。。。有点简单啊。。。

每个节点,往儿子搜,每次搜索的时候,如果没儿子,就加1统计一下就好了,最后一期输出即可。

终于怒切一道水题,真爽。

PS. AC以后打算学习一下别的道友AC的方法是什么,看了一下好像还是dfs简单,算了不看了。。。hhh

Code:基础DFS

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define inf 105
#define INF 0x3f3f3f3f
#define loop(x,y,z) for(x=y;x<z;x++)

int n,m;
vector<int>node[inf];//各节点孩子
int leaves[inf];//各层叶子数
int depth;//树的深度

void Input()
{
    int i,v,len,u;
    scanf("%d%d",&n,&m);
    memset(leaves,0,sizeof leaves);//初始化
    depth=0;
    loop(i,0,n)node[i].clear();

    loop(i,0,m)//建树
    {
        scanf("%d%d",&v,&len);
        while(len--)
        {
            scanf("%d",&u);
            node[v].push_back(u);
        }
    }
}

int dfs(int v,int step)//当前节点,当前深度
{
    int len=node[v].size();
    if(!len)leaves[step]++;
    int i;
    loop(i,0,len)
    {
        int u=node[v][i];
        dfs(u,step+1);
    }
    depth=max(depth,step+1);//节点是叶子,层数也存在,所以+1
}

void Output()
{
    int i;
    loop(i,1,depth-1)printf("%d ",leaves[i]);
    printf("%d\n",leaves[i]);
}

int main()
{
    Input();
    dfs(1,1);
    Output();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Hide_in_Code/article/details/81513226