/*************************************************************************************
本题使用的数据结构为:邻接表;
在创建邻接表的过程中,同时将该数据所在的层也加入邻接表中;
具体方法:加入邻接表头插法,其邻接表头和字节点为父子关系,即表头的层总是比节点元素大一;
根据这个关系,每个数据所在的层将录入邻接表;
接下来是遍历这个邻接表,count[children[i].level] ++;最后输出count里面的元素即可;
******************/
#include <iostream>
#include <vector>
#include <stdlib.h>
using namespace std;
int maxlevel = 1;
//数据结构:邻接表
typedef struct Child {
int ID;
Child *next;
Child()
{
ID = 0;
next = NULL;
}
};
typedef struct Member {
int level;//表头元素所在层
int child_num;
Child *Mchild;
Member()
{
level = 0;
child_num = 0;
Mchild = NULL;
}
}*memeber;
int main()
{
int node_num, noLeaf_node;
int num_level, child_num, v_child;
int count[100] = { 0 };
Child *new_child = NULL;
cin >> node_num >> noLeaf_node;
vector<Member>children(node_num+1);
children[1].level = 0;
for (int i = 0; i < noLeaf_node; i++) {
cin >> num_level >> v_child;
for (int j = 0; j < v_child; j++) {
new_child = new Child;
cin >> new_child->ID;
new_child->next = children[num_level].Mchild;
children[num_level].Mchild = new_child;
children[num_level].child_num++;
children[new_child->ID].level = children[num_level].level + 1;
}
}
int temp_level = 0;
for (int i = 1; i <= node_num; i++) {
if (children[i].level > temp_level)
temp_level = children[i].level;
if (children[i].Mchild == NULL)
count[children[i].level] ++;
}
int i = 0;
for ( i = 0; i < temp_level; i++)
cout << count[i] << " ";
cout << count[i] << endl;
return 0;
}