本题翻译:
题目给第一行,输入多少对结点,后面就是输入节点1 2,这两个是连在一起的。求最深的节点。
本题思路:
利用深度搜索搜三次,第一次是判断是不是树,第二次判断随机最深的一个节点,第三次就是利用该节点,求另一端最远的节点。
详细代码样例:
#include <bits/stdc++.h>
using namespace std;
int N;
int visited[100001];
vector <int> v[100001];
int maxdis = 0;
vector <int> final_point;//记录最大的节点啦
int max_point = 0;//记录最大的点
set <int>final_ans;
void dfs(int cur){//需要的信息仅仅只是当前节点
if(visited[cur]) return;//如果遍历过了,退出
visited[cur] = 1;//记录该节点遍历过了
for(int i:v[cur]){//寻找所有的邻居开始遍历
dfs(i);
}
}
void dfs1(int cur,int curlen){
if(visited[cur]) return;
visited[cur] = 1;
if(curlen>maxdis){
maxdis = curlen;
final_point.clear();//如果有大于的 最深节点就要更新咯
final_point.emplace_back(cur);
}
else if(curlen==maxdis){
final_point.emplace_back(cur);
}
for(int i:v[cur]){
dfs1(i,curlen+1);
}
}
int main(){
cin>>N;
int C=N-1;
while(C--){
int i,j;
cin>>i>>j;
//存好相邻的节点,互为邻居
v[i].emplace_back(j);
v[j].emplace_back(i);
}//把遍历的visited全部赋值为0 即未遍历
int count = 0;//计数
for(int i=1;i<=N;i++) visited[i]=0;
for(int i=1;i<=N;i++) {
if(!visited[i]){//未遍历过
count++;
dfs(i);//
}
}//判断是否为树就成功啦
if(count>1){
cout<<"Error: "<<count<<' '<<"components";
} else{
//接下来就是找根节点,也就是最远的节点
for(int i=1;i<=N;i++) visited[i]=0;//清空标记点
dfs1(1,0); //找到最远的点咯
for(int i=0;i<final_point.size();i++)
for(int i:final_point) final_ans.insert(i);
final_point.clear();
for(int i=1;i<=N;i++) visited[i]=0;//清空标记点
maxdis=0;
dfs1(*final_ans.begin(),0);
for(int i:final_point) final_ans.insert(i);
for(int i:final_ans) cout<<i<<endl;
}
}
本题难度还可以,但是有一个点过不去,不知道为啥超时,理论上应该不会超时呀,不能理解。感谢b站的up主弄夫,太厉害啦!
up主的视频指路视频指路