#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <queue>
using namespace std;
const int maxn=10010;
vector<int> Adj[maxn];
int N;
set<int> droot;
bool vis[maxn];
bool inq[maxn];
int edge;
void BFS(int u){
queue<int> q;
q.push(u);
inq[u]=true;
while(!q.empty()){
int v=q.front();
q.pop();
for(int i=0;i<Adj[v].size();i++){
int t=Adj[v][i];
if(!inq[t]){
inq[t]=true;
edge++;
q.push(t);
}
}
}
}
int BFSTravel(){
fill(inq,inq+maxn,false);
int cnt=0;
edge=0;
for(int u=1;u<=N;u++){
if(!inq[u]){
BFS(u);
cnt++;
}
}
return cnt;
}
int isTree(){
int cnt=BFSTravel();
if(cnt==1 && edge==N-1) return -1;
return cnt;
}
int findR(int r){
int h=0;
vis[r]=true;
for(int i=0;i<Adj[r].size();i++){
int v=Adj[r][i];
if(!vis[v]){
int th=findR(v);
if(th>h) h=th;
}
}
return h+1;
}
int main(void){
scanf("%d",&N);
int v1,v2;
for(int i=0;i<N-1;i++){
scanf("%d%d",&v1,&v2);
Adj[v1].push_back(v2);
Adj[v2].push_back(v1);
}
int judge=isTree();
if(judge!=-1){
printf("Error: %d components",judge);
return 0;
}
int h=-1,th;
for(int i=1;i<=N;i++){
fill(vis,vis+maxn,false);
th=findR(i);
if(th>h){
droot.clear();
droot.insert(i);
h=th;
}else if(th==h){
droot.insert(i);
}
}
set<int>::iterator it;
for(it=droot.begin();it!=droot.end();it++){
printf("%d\n",*it);
}
return 0;
}
PAT (Advanced Level) Practice 1021 Deepest Root (25 分)
最新推荐文章于 2022-06-13 16:03:16 发布