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;
}
posted @ 2024-03-19 11:31  YuKiCheng  阅读(13)  评论(0编辑  收藏  举报