1004 Counting Leaves
题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805521431773184
解题思路
1.vector记录每个节点的子节点;
2.用BFS遍历的同时记录节点的子节点树ans[to];
3.当节点to的子节点有子节点时,ans[to]-1(最小为0);
4.有个测试点是考察只有根节点(即m==0)的特殊情况。
总结
1.考察BFS的层次性。
代码展示
#include<bits/stdc++.h>
using namespace std;
/*
求出每一层叶子节点的个数
5 3
01 2 03 02
02 1 04
03 1 05
*/
vector<int>G[200];
map<string,int>p;
queue<int>q;
int ans[200];
int to;
void BFS(){
while(!q.empty()){
int l=q.size();
ans[to++]=l;
for(int i=0;i<l;i++){
int f=q.front();
q.pop();
if(G[f].size())ans[to-1]=max(0,ans[to-1]-1);
for(int j=0;j<G[f].size();j++){
q.push(G[f][j]);
}
}
}
}
int main(){
int n,m;
cin>>n>>m;
int tol=1;
for(int i=0;i<m;i++){
string s1;int k;
cin>>s1>>k;
if(!p[s1])p[s1]=tol++;
if(s1=="01")q.push(p[s1]);
while(k--){
string s2;
cin>>s2;
if(!p[s2])p[s2]=tol++;
G[p[s1]].push_back(p[s2]);
}
}
BFS();
for(int i=0;i<to;i++){
if(i!=0)cout<<" ";
cout<<ans[i];
}
if(to==0)
cout<<1<<endl;
return 0;
}
本文详细介绍了如何使用BFS算法解决1004CountingLeaves问题,通过构建节点间的父子关系并利用队列进行层次遍历,实现统计每层叶子节点数量的功能。特别注意处理只有根节点的情况。
423

被折叠的 条评论
为什么被折叠?



