题目链接
这道题深搜广搜都可以,但是我最开始写的搜索只得了一分,可怜。

深搜DFS

 #include<bits/stdc++.h>
 using namespace std;
 const int maxn=1e5+5;
 vector<int> v[maxn],ans;
 int opt=-1;
 void dfs(int x, int now){
 	if(now > opt && v[x].size() == 0){ //深度最深,且没有孩子节点了 
 		opt = now;
 		ans.clear();        
	 }
	if(now == opt){    
		ans.push_back(x);
	}
	for(int i=0;i<v[x].size();i++){
		dfs(v[x][i], now+1);
	}
 }
 int main(){
 	int n,num,root;
 	cin>>n;
 	for(int i=1;i<=n;i++){
 		cin>>num;
			if(num == -1) root=i;
			else v[num].push_back(i);
	 }
 	dfs(root,1);
 	cout<<opt<<endl;
 	for(int i=0;i<ans.size();i++){
 		cout<<ans[i];
 		if(i!=ans.size()-1) cout<<" ";
	 }
 	
 	return 0;
 } 

广搜BFS

 #include<bits/stdc++.h>
 using namespace std;
 const int maxn=1e5+5;
 vector<int> v[maxn];
 int level[maxn];
 int opt=1; //初始值很关键 
 void bfs(int r){
 	queue<int> q;
 	q.push(r);
 	level[r] = 1;
 	while(!q.empty()){
 		int tmp = q.front();
 		q.pop();
 		for(int i=0;i<v[tmp].size();i++){
 			 int j = v[tmp][i];
			 level[j] = level[tmp] + 1;
			 q.push(j);
			 if(level[j] > opt) opt = level[j];
		 }
	 }
 }
 int main(){
 	int n,num,root;
 	cin>>n;
 	for(int i=1;i<=n;i++){
 		cin>>num;
			if(num == -1) root=i;
			else v[num].push_back(i);
	 }
 	bfs(root);
 	cout<<opt<<endl;
 	int flag=0;
 	for(int i=1;i<=n;i++){
 		if(level[i] == opt)
 			if(flag==0){
 				cout<<i;
 				flag=1;
			 }else{
			 	cout<<" "<<i;
			 }
	 }
 	return 0;
 } 

暴力求解

只能得16分,会超时。
因为求每个节点,存在大量重复的递归。
比如2是3的父节点,求2的深度时递归过一次,求3的时候又要重新递归计算。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int arr[maxn];
int root;
int dfs(int x, int deep){
	if(x == root) return deep;
	else return dfs(arr[x], deep+1); //这个return很关键 
}

int main(){
	int n,num;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>arr[i];
		if(arr[i]==-1) root=i;
	}
	int max_deep=-1;
	vector<int> v;
	for(int i=1;i<=n;i++){
		int tmp = dfs(i,1);
		if( tmp > max_deep){
			max_deep = tmp;
			v.clear();
			v.push_back(i);
		}else if(tmp == max_deep){
			v.push_back(i);
		}
	}
	cout<<max_deep<<endl;
	for(int i=0;i<v.size();i++){
		cout<<v[i];
		if(i!=v.size()-1) cout<<" ";
	}
	return 0;
}