L2-026 小字辈(25分)
第一眼想到BFS,一次就AC了haha。
我的思路是用level记录当前是多少层,然后到最后一层的时候,将这一层的元素放到set集合里面。
输出的时候注意末尾不要有空格。
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
#define ll long long
vector<vector<int>> vec;
int main() {
int n;
cin >> n;
vec.resize(n+10);
int root = 0;
for (int i = 1; i <= n; i++) {
int parent;
cin >> parent;
if (parent != -1) {
vec[parent].push_back(i);
}
else {
root = i;
}
}
int pcnt = 0;
int level = 0;
set<int> res;
queue<int> v;
v.push(root);
int flag = 0;
while (!v.empty()) {
int left = v.size();//left=2
if (pcnt + left >= n) {//需要将这一次弹出来的全部记录下来
flag = 1;
}
level++;
for (int i = 0; i < left; i++) {
int parent = v.front();
v.pop();
if (flag) res.insert(parent);
++pcnt;//弹出加一
for (int j = 0; j < vec[parent].size(); j++) {
v.push(vec[parent][j]);
}
}
}
cout << level << endl;
for (set<int>::iterator it = res.begin(); it != res.end();) {
cout << *it;
if (++it != res.end()) cout << " ";
}
return 0;
}
翻阅了其他博客,我觉得这一篇的思路也很好。https://blog.csdn.net/sm20170867238/article/details/89946462
子节点在父节点深度基础上增加。
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
vector<int> vec[100005];
int arr[100005],depth[100005];
int Bfs()
{
queue<int> que;
que.push(vec[0][0]);//根节点只有一个孩子,直接把这个孩子传进队列
int x;
while(!que.empty())
{
x=que.front();
que.pop();
for(int i=0;i<vec[x].size();i++)//搜索所有子孩子
{
depth[vec[x][i]]=depth[x]+1;//深度为父节点深度+1
que.push(vec[x][i]);
}
}
return depth[x];//返回树的深度
}
int main()
{
int n,i;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>arr[i];
if(arr[i]==-1)//根节点改成0
arr[i]=0;
}
for(i=1;i<=n;i++)
{
vec[arr[i]].push_back(i);// i是arr[i]的孩子
if(arr[i]==0)
depth[i]=1;//根节点深度为 1
}
int ans=Bfs();
bool flag=0;
cout<<ans<<endl;
for(i=1;i<=n;i++)//遍历找出距离根节点最远的叶节点
{
if(depth[i]==ans)
{
if(flag)//避免输出多余的空格
cout<<' ';
cout<<i;
flag=1;
}
}
cout<<endl;
return 0;
}