[PAT]1004.Counting leves(30)
一、题目信息
题目地址:http://www.patest.cn/contests/pat-a-practise/1004
二、题目分析及代码
该题要求输出每层中无孩子节点的成员数,显然用广度遍历
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
int main()
{
int i_tmp;
int n,m;
scanf("%d%d",&n,&m);
//建立图:
vector<int> edge[100];
int id,k;
while(m--){
scanf("%d%d",&id,&k);
while(k--){
scanf("%d",&i_tmp);
edge[id].push_back(i_tmp);
}
}
//通过广度遍历:确立层次,统计各层次中无孩子数:
int level[100];//每个顶点所在的层数
for(int i=0;i<100;++i){
level[i] = 1;
}
int members[100];//每层无孩子的成员数
for(int i=0;i<100;++i){
members[i] = 0;
}
queue<int> Q;
level[1] = 1;
Q.push(1);
while(Q.empty() == false){
int parent = Q.front();
Q.pop();
int parentL = level[parent];
if(edge[parent].empty()){
members[parentL]++;
}
int child;
for(int i = 0;i < edge[parent].size();++i){
child = edge[parent][i];
level[child] = parentL + 1;
Q.push(child);
}
}
//输出结果:
int maxLevel = 1;
for(int i = 1;i<100;++i){
if(level[i] > maxLevel){
maxLevel = level[i];
}
}
for(int i =1;i < maxLevel;++i){
printf("%d ",members[i]);
}
printf("%d\n",members[maxLevel]);
return 0;
}