题目意思约等于给定一个树,求叶节点数。
测试用例其实还是蛮宽松的,显然不考虑族内通婚(……)所以也不用记录某个节点是否被访问到了。因为是按每层输出,所以每次level变化的时候都要输出。如果3和4过不了可以考虑下是不是中间有多层全是非叶节点的时候没有正确判断。单个根节点的情况也要考虑到。
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=105;
bool g[maxn][maxn]={false};
//bool vis[maxn]={false};
struct Node{
int id;
int level;
Node():id(0),level(0){};
Node(int i, int l):id(i),level(l) {};
};
int main() {
int n,m;
scanf("%d%d",&n,&m);
if(n==0){
return 0;
}
for(int i=0;i<m;i++){
int id,k;
scanf("%d%d",&id,&k);
for(int j=0;j<k;j++){
int child;
scanf("%d",&child);
g[id][child]=true;
}
}
queue<Node> q;
q.push(Node(1,0));
int num=0;
int currlevel=0;
while(!q.empty()){
Node first=q.front();
q.pop();
if(first.level!=currlevel){
printf("%d ",num);
num=0;
currlevel=first.level;
}
bool flag=false;
for(int i=1;i<maxn;i++){
if(g[first.id][i]/* && !vis[i]*/){
q.push(Node(i,first.level+1));
flag=true;
}
}
if(!flag) num++;
}
printf("%d",num);
}