考查点:BFS或DFS
思路:本题为求各层叶节点个数,深搜和广搜都可以,深搜写起来更方便
DFS版本:
#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#define FOR(i, x, y) for(int i = x; i < y; i++)
#define rFOR(i, x, y) for(int i = x; i > = y; i--)
#define MAXN 110
#define oo 0x3f3f3f3f
using namespace std;
vector<int> child[MAXN];
int h[MAXN];
int ml;
void DFS(int index,int level)
{
if(child[index].empty()){
h[level]++;
if(level>ml) ml=level;
return;
}
FOR(i,0,child[index].size()){
DFS(child[index][i],level+1);
}
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
int n,m;
scanf("%d%d",&n,&m);
FOR(i,0,m)
{
int id,k;
scanf("%d%d",&id,&k);
FOR(j,0,k)
{
int x;
scanf("%d",&x);
child[id].push_back(x);
}
}
DFS(1,0);
FOR(i,0,ml+1){
printf("%d",h[i]);
if(i!=ml)printf(" ");
}
return 0;
}
BFS版本:
#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#define FOR(i, x, y) for(int i = x; i < y; i++)
#define rFOR(i, x, y) for(int i = x; i > = y; i--)
#define MAXN 110
#define oo 0x3f3f3f3f
using namespace std;
vector<int> child[MAXN];
int h[MAXN];
int ml;
int leaf[MAXN];
void BFS(){
queue<int> q;
q.push(1);
while(!q.empty()){
int id=q.front();
q.pop();
ml=max(ml,h[id]);
if(child[id].size()==0){
leaf[h[id]]++;
}
FOR(i,0,child[id].size())
{
int k=child[id][i];
q.push(k);
h[k]=h[id]+1;
}
}
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
int n,m;
scanf("%d%d",&n,&m);
FOR(i,0,m)
{
int id,k;
scanf("%d%d",&id,&k);
FOR(j,0,k)
{
int x;
scanf("%d",&x);
child[id].push_back(x);
}
}
BFS();
FOR(i,0,ml+1){
printf("%d",leaf[i]);
if(i!=ml)printf(" ");
}
return 0;
}