原题链接
题目大意
输入:
N 树的结点数 0<N<100
M 非叶子结点数
接下来M行
ID K ID[1] ID[2] … ID[k]
ID 2位数,表示非叶子结点的编号,k是儿子结点的个数 接下来k个儿子结点的ID
输出:每层叶子结点的个数
测试点1 3是输入顺序的问题
自测用例
4 2
03 2 01 02
04 1 03
和
4 2
04 1 03
03 2 01 02
#include<bits/stdc++.h>
using namespace std;
const int N=505;
int a[N];//a下标是孩子a[i]的值是父亲,
int ans[N];//每层叶子结点的个数
vector<int>root;//输入的每个结点都会保存
int level[N];//level[i]是在第几层
int vis[N];//判断这个结点是否有孩子,-1代表不是结点,0是叶子结点,1不是叶子结点
int c;
int n,m;
int f(string s){
return (s[0]-'0')*10+s[1]-'0';
}
int main(){
cin>>n>>m;
if(m==0){
cout<<n;
return 0;
}
memset(vis,-1,sizeof(vis));
for(int i=1;i<=m;i++){
string Sr,Schil;
int r,chil,k;
cin>>Sr;
r=f(Sr);
root.push_back(r);
cin>>k;
for(int j=1;j<=k;j++){
Schil.clear();
cin>>Schil;
chil=f(Schil);
root.push_back(chil);
a[chil]=r;
}
}
for(int i=0;i<root.size();i++){
int k=root[i];
if(vis[k]==-1)//测试点1 3当vis已经被标记为父亲结点就不能再重新标记叶子结点
vis[k]=0;
int f=0;
while(a[k]){
f++;
vis[a[k]]=1;
k=a[k];
}
level[root[i]]=f;
c=max(c,f);
}
for(int i=1;i<=99;i++){
if(vis[i]==0){
ans[level[i]]++;
}
}
for(int i=0;i<=c;i++){
if(i==0)
cout<<ans[i];
else{
cout<<" "<<ans[i];
}
}
return 0;
}