给出一棵树,01节点为树根,要求输出每一层(高度相同的节点)上叶节点的个数
有点像广度优先搜索的意思,
用二维数组tree[][]存放树每一层的节点
递推的方法构建tree[][],先求出根节点(高度为1)的子节点,放在tree[1][];
再求高度为2的所有的节点放在tree[2][];
.........
.........
.........
扫一遍tree[][]数组就得出结果了
开始吗没仔细读题,以为要输出没一高度叶节点的编号,就弄了个ans[][],
后来仔细读题后才发现没必要,,,不管了,不改了
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=105;
bool gh[maxn][maxn];
int tree[maxn][maxn];
int ans[maxn][maxn];
int n,m;
void input() {
int k;
int variable1,variable2;
while(m--) {
cin>>variable1>>k;
while(k--) {
cin>>variable2;
gh[variable1][variable2]=true;
}
}
}
void solove() {
int i,k,temp=0,cnt,j,r;
for(i=1; i<=n; i++)
if(gh[1][i]) {
tree[1][temp++]=i;
}
for(i=1; i<=n; i++) {
cnt=temp;
temp=0;
r=1;
for(k=0; k<cnt; k++) {
bool flag=false;
for(j=1; j<=n; j++)
if(gh[tree[i][k]][j]) {
tree[i+1][temp++]=j;
flag=true;
}
if(flag==false)
ans[i][r++]=tree[i][k];
}
ans[i][0]=r-1;
if(r-1==cnt)
break;
}
printf("0");
for(j=1; j<=i; j++)
printf("% d",ans[j][0]);
printf("\n");
/*
for(j=1; j<=i; j++) {
printf("%d",ans[j][0]);
for(k=1; k<=ans[j][0]; k++)
printf("% d",ans[j][k]);
printf("\n");
}*/
}
int main() {
while(cin>>n>>m) {
memset(gh,false,sizeof(gh));
memset(tree,0,sizeof(tree));
input();
if(n==1)
{
printf("1\n");
continue;
}
solove();
}
return 0;
}