疑问
暂无
代码
//这道题用一下层序遍历
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 110;
struct node{
int depth=0;
vector<int> child;
}Node[maxn];
int hashTable[maxn]; //记录深度i对应的无子嗣人数
//家庭成员
int n; //编号从1开始
//有孩子的家庭成员
int m;
//最大深度
int depth=-1; //根结点为深度1
void layerOrder(){
Node[1].depth = 1;
queue<int> q;
q.push(1);
while(!q.empty()){
int cur = q.front();
q.pop();
if(Node[cur].child.size() == 0){
hashTable[Node[cur].depth]++;
if(Node[cur].depth > depth){
depth = Node[cur].depth;
}
}else{
for(int i=0;i<Node[cur].child.size();i++){
q.push(Node[cur].child[i]);
Node[Node[cur].child[i]].depth = Node[cur].depth + 1;
}
}
}
}
int main(){
fill(hashTable,hashTable+maxn,0);
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
int now;
int num;
scanf("%d %d",&now,&num);
for(int j=0;j<num;j++){
int cnum;
scanf("%d",&cnum);
Node[now].child.push_back(cnum);
}
}
layerOrder();
for(int i=1;i<=depth;i++){
printf("%d%c",hashTable[i],i==depth?'\n':' ');
}
return 0;
}
反思
- 与A1094类似;
- 最后一行借鉴了网上的写法,
printf("%d%c",hashTable[i],i==depth?'\n':' ');
这样就能在一行之内判断是不是最后一个输出了。
二刷代码
二刷的时候看书上说,对于没有给数据域的树,可以直接使用vector<int> child[maxn]
来存储,不需要单独地使用结构体,这点我学到了。
对于深度的存储,我参考了之前在拓扑排序中得到的技巧。
总体来说,难度还是可以的。
//采用简洁方式表示的树
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 110;
vector<int> child[maxn];//暂时我就没初始化了
int cnt[maxn]={0};
int main(){
int n,m;
scanf("%d",&n);
if(n==0){
return 0;
}
scanf("%d",&m);
//接下来进行读取
for(int i=0;i<m;i++){
int id,k,cur;
scanf("%d %d",&id,&k);
for(int j=0;j<k;j++){
scanf("%d",&cur);
child[id].push_back(cur);
}
}
//然后进行层序遍历
queue<int> q;
q.push(1);
int layer=0;
while(!q.empty()){
int size = q.size();
for(int i=0;i<size;i++){
int cur = q.front();
q.pop();
if(child[cur].size()==0){
cnt[layer]++;//增加
}else{
for(int j=0;j<child[cur].size();j++){
q.push(child[cur][j]);
}
}
}
layer++;
}
//输出
for(int i=0;i<layer;i++){
printf("%d",cnt[i]);
if(i!=layer-1){
printf(" ");
}
}
return 0;
}