一、题目概述&样例
即:族谱以树形结构存储, 输出每层无子结点数量
Sample Input:
2 1
01 1 02
Sample Output:
0 1
二、思路
BFS解决;
核心代码:
q.push(1);//根入队
while( !q.empty() )
{
p = q.front();
q.pop();//出队结点
if( !Tree[p].size() )//处理出队结点
++cnt;
for( int i = 0; i < Tree[p].size(); ++i )//结点孩子入队
q.push( Tree[p][i] );
if( p == last )//若出队的是本层最后一个结点
{
last = q.back();//则最后入队的结点为下层最后一个结点
printf("%s%d", p == 1 ? "":" ", cnt);//输出本层叶子数量
cnt = 0;
}
}
三、代码
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int main()
{
int N, M, last = 1, p, cnt = 0;
scanf("%d %d", &N, &M);
if( !N )
{
printf("1");
return 0;
}
vector<int> Tree[100];
for( int i = 0, node, K; i < M; ++i )
{
scanf("%d %d", &node, &K);
for( int j = 0, t; j < K; ++j )
{
scanf("%d", &t);
Tree[node].push_back(t);
}
}
queue<int> q;
q.push(1);
while( !q.empty() )
{
p = q.front();
q.pop();
if( !Tree[p].size() )
++cnt;
for( int i = 0; i < Tree[p].size(); ++i )
q.push( Tree[p][i] );
if( p == last )
{
last = q.back();
printf("%s%d", p == 1 ? "":" ", cnt);
cnt = 0;
}
}
}