Note
- 图的遍历
- BFS
- bfs中可以尽量减少if-else,不必要的判断可以放到bfs之外
- 用set可以避免排序 (set有序),而且保证不会重复。但是set的遍历只能用迭代器!
Code
#include<bits/stdc++.h>
using namespace std;
struct Node{
int root,height;
Node(int r,int h){
root=r;
height=h;
}
};
int n;
vector<int> v[10010];
set<int> ans;
bool isvisit[10010]={false};
int bfs(int root){
int maxHeight=-1;
queue<Node> q;
q.push(Node(root,0));
while(!q.empty()){
Node data=q.front();
q.pop();
isvisit[data.root]=true;
for(int i=0;i<v[data.root].size();i++){
int num=v[data.root][i];
if(isvisit[num]==false){
q.push(Node(num,data.height+1));
}
}
if(data.height>maxHeight)
maxHeight=data.height;
}
return maxHeight;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("data.txt","r",stdin);
#endif
int a,b,cnt=0;
cin>>n;
for(int i=1;i<n;i++){
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
for(int i=1;i<=n;i++){
if(isvisit[i]==false){
int tmp=bfs(i);
cnt++;
}
}
if(cnt!=1) printf("Error: %d components",cnt);
else{
int maxheight=-1;
for(int i=1;i<=n;i++){
memset(isvisit,false,sizeof(isvisit));
int h=bfs(i);
if(h>maxheight){
maxheight=h;
ans.clear();
ans.insert(i);
}
else if(h==maxheight){
ans.insert(i);
}
}
for(set<int>::iterator it=ans.begin();it!=ans.end();++it)
printf("%d\n",*it);
}
return 0;
}