L2-026 小字辈 (25 分)

个人觉得,bsf更像是dfs的改进版,嗯,也许是我理解的太浅显了。

在这里插入图片描述

对于这个题,首先想的是递归,然后发现没有结束条件,emm,然后明白了 是这种情况还要记录步骤的话 最好的办法就是bfs了 广度优先搜,所有的方向都去,然后记录,然后再深入。代码如下(liuchuo大佬的)

#include <bits/stdc++.h>
using namespace std;
struct node {
	int id,level;   //结构体用来储存下标(id)和level(辈分)
};
int main(){
	int n,temp,maxlevel=-1;
	cin>>n;
	queue<node>q; 
	vector<vector<int>> v(n+1);  //二维动态数组用来储存
	vector<node>  ans;
	for(int i=1;i<=n;i++){
		cin>>temp;
		if(temp==-1)temp=0;
		v[temp].push_back(i);
	}
	q.push({0,0});  //-1代表祖宗的父/母
	while(!q.empty()){
		node qq=q.front();
		int id=qq.id,level=qq.level;
		if(qq.level>maxlevel)maxlevel=qq.level;
		ans.push_back(qq);  //储存用来做后面的遍历输出
		q.pop();
		for(int i=0;i<v[id].size();i++){
			q.push({v[id][i],level+1});
		}}
		cout<<maxlevel<<endl;
		for(int i=0;i<ans.size();i++){
			if(ans[i].level==maxlevel){
				cout<<ans[i].id;
				if(i!=ans.size()-1)cout<<' ';
			}
		}
	
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值