题目链接
这道题深搜广搜都可以,但是我最开始写的搜索只得了一分,可怜。
深搜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;
}