艰难的英语单词:
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;
}