1004. Counting Leaves (30)
英语不好,理解错了题意。学英语的重要性啊...
其实就是找每层叶子节点的个数,深搜一遍就行了
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
const int N=502;
int start[N],cnt=0,ans[N];
struct edge{
int v,next;
}e[N*N];
void add(int u,int v){//u->v
e[cnt].v=v;
e[cnt].next=start[u];
start[u]=cnt++;
}
int maxcen=-1;
void dfs(int rt,int cen){
maxcen=max(maxcen,cen);
if(start[rt]==-1){//没有孩子-该层叶子节点增加
ans[cen]++;
return;
}
for(int i=start[rt];i!=-1;i=e[i].next){
int nv=e[i].v;
dfs(nv,cen+1);
}
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<=n;i++)
start[i]=-1;
for(int i=0,f,k,s;i<m;i++){
scanf("%2d %d",&f,&k);
while(k--){
scanf("%2d",&s);
add(f,s);
}
}
dfs(1,0);
int first=0;
for(int i=0;i<=maxcen;i++){
if(first) printf(" %d",ans[i]);
else first=1,printf("%d",ans[i]);
}
return 0;
}
/*统计 树的每层的叶子节点个数
一个节点没有孩子则称为叶子节点
*/