注意的是m代表的是the number of non-leaf nodes 要看清楚题意,一开始把n - m认为是输入的行数了…
利用vector特性 题意大致是寻找每层叶结点的个数,DFS遍历这棵树,遍历时统计即可。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 110;
struct node
{
vector<int> child;
}Node[MAXN];
int maxdepth = -1;
int leaf[MAXN];
bool vis[MAXN];
void DFS(int u,int depth)
{
vis[u] = true;
if(depth > maxdepth)
{
maxdepth = depth;
}
if(Node[u].child.size() == 0)
{
leaf[depth]++;
return ;
}
for(int i = 0;i<Node[u].child.size();i++)
{
if(vis[Node[u].child[i]] == false)
{
DFS(Node[u].child[i],depth + 1);
}
}
}
int main(void)
{
freopen("pat0314/in.txt","r",stdin);
int m,n;
cin>>n>>m;
if(n == 0)
{
return 0;
}
for(int i = 0;i<m;i++)
{
int id,k;
cin>>id>>k;
for(int j = 0;j<k;j++)
{
int num;
cin>>num;
Node[id].child.push_back(num);
}
}
DFS(1,0);
// printf("%d",maxdepth);
for(int i = 0;i<=maxdepth;i++)
{
if(i == 0)
{
printf("%d",leaf[i]);
}
else
{
printf(" %d",leaf[i]);
}
}
return 0;
}