题目链接:https://www.patest.cn/contests/pat-a-practise/1021
题目大意:找出树中能使树的深度达到最大的根。
解题思路:
定义深度优先DFS(int v,int high),该函数用来找离v点最远点的集合先任取一点v,进行dfs找到离v点最远的一部分点即为集合set1,这些点是最终要求的点的子集。从set1中任选一点,在进行一次DFS,得到set2。set1和set2的并集即为最终所求。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> node[
10001];
int visit[
10001]={
0};
int n;
int maxhigh=
0;
vector<int> tmp;
void dfs(
int v,
int high){
if(high>maxhigh){
maxhigh=high;
tmp.clear();
tmp.push_back(v);
}
else if(high==maxhigh){
tmp.push_back(v);
}
visit[v]=
1;
for(
int i=
0;i<node[v].size();i++){
if(visit[node[v][i]]==
0){
dfs(node[v][i],high+
1);
}
}
}
int main(
int argc,
char const *argv[])
{
cin>>n;
int a,b;
int flag[
10001]={
0};
for(
int i=
1;i<=n-
1;i++){
cin>>a>>b;
node[a].push_back(b);
node[b].push_back(a);
}
int cnt=
0;
for(
int i=
1;i<=n;i++){
if(visit[i]==
0){
dfs(i,
1);
cnt++;
}
}
if(cnt>
1)
cout<<
"Error: "<<cnt<<
" components"<<endl;
else{
for(
int i=
0;i<tmp.size();i++){
flag[tmp[i]]=
1;
}
int start=tmp[
0];
tmp.clear();
for(
int i=
1;i<=n;i++)
visit[i]=
0;
dfs(start,
1);
tmp.push_back(start);
for(
int i=
0;i<tmp.size();i++)
flag[tmp[i]]=
1;
for(
int i=
1;i<=n;i++){
if(flag[i]==
1)
cout<<i<<endl;
}
}
return 0;
}