PAT 甲级 1021 Deepest Root
(1)N 个节点,N-1 条边,且连通分支数为 1,则是一棵树。
(2)从这颗树上任意一点开始 BFS,最远的点一定是所求目标点。
(3)还剩下一部分目标点,从上一步得到的点中任意一个开始 BFS,最远的点也一定是目标点。两次目标点集合求并即可。
#include <bits/stdc++.h>
using namespace std;
int n,a,b;
vector<int> graph[10010];
bool in_q[10010];
int layer[10010], max_layer;
set<int> ans;
void BFS(int root){
queue<int> q;
layer[root]=0; max_layer=0;
q.push(root); in_q[root]=true;
while(!q.empty()){
int now=q.front();q.pop();
if(layer[now]>max_layer)
max_layer=layer[now];
for(auto i:graph[now]){
if(!in_q[i]){
q.push(i); in_q[i]=true;
layer[i]=layer[now]+1;
}
}
}
}
int main() {
scanf("%d",&n);
int a,b;
for(int i=0;i<n-1;++i){
scanf("%d %d",&a,&b);
graph[a].push_back(b);
graph[b].push_back(a);
}
memset(in_q,0,sizeof(in_q));
int block_num=0;
for(int i=1;i<=n;++i){
if(!in_q[i]){
BFS(i);
block_num++;
}
}
if(block_num>1){
printf("Error: %d components\n",block_num);
return 0;
}
for(int i=1;i<=n;++i) if(layer[i]==max_layer) ans.insert(i);
memset(in_q,0,sizeof(in_q));
BFS(*ans.begin());
for(int i=1;i<=n;++i) if(layer[i]==max_layer) ans.insert(i);
for(auto i:ans) cout<<i<<endl;
}