PAT 甲级1004 Counting Leaves(vector模拟树)
1004 Counting Leaves
题目说明:
给定一棵树的节点总数N(0<N<100)和非叶节点总数M,以及非叶节点的孩子情况来计算每层的叶节点数
输入输出解释:
Sample Input:
2 1 //树共有两个节点,1个非叶节点
01 1 02 //第一个非叶节点序号为1,有一个子节点2
Sample Output:
0 1 //第一层没有叶结点(只有1号根节点),第二层有一个叶结点(2号节点)
注意的地方
- 注意只有一个根节点时输出1,第一层1号节点既是根节点也是叶结点
- 在给非叶节点时,不一定按照1-2-3-4顺序给出,也就是可能先给你子节点信息,再给你父节点信息,这样建树或者存储时候都得考虑(不考虑这个提交时候卡1,3测试点)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<vector<int>>dic(100); //存每个节点的子节点,dic[i]代表i的子节点
vector<int>level(100); //存每个节点所在层数
vector<int>leaves(100, 0); //leaves[i]代表i层的叶子节点数
level[1] = 1; //根节点在1层
int n, m;
cin>>n>>m;
if(n == 1)
{
cout<<1;
return 0;
}
for(int i = 0; i < m; i++)
{
int num, k;
cin>>num>>k;
for(int j = 0; j < k; j++)
{
int t;
cin>>t;
dic[num].push_back(t);
}
}//end fori
for(int i = 1; i < 100; i++)
{
if(!dic[i].empty())
{
for(auto c : dic[i])
{
level[c] = level[i] + 1;
if(dic[c].empty())
leaves[level[c]]++;
}
}
}//end fori
int max_leve = *max_element(level.begin(), level.end());
for(int i = 1; i <= max_leve; i++)
{
if(i == max_leve)
cout<<leaves[i];
else
cout<<leaves[i]<<' ';
}
}
结果


浙公网安备 33010602011771号