先用并查集存。且图中只存单边
然后判断利用并查集判断连通分量的个数
如果是连通图,利用并查集补充为无向图,再次bfs得最大深度
但是第一个点竟然没过!!!!!
#include <cstdio>
#include <queue>
#include <set>
#include <vector>
#define MAX 10010
#include <string.h>
using namespace std;
//并查集
int tree[10010];
int n;
vector <int> node[MAX];
set <int> ans;
int bfs(int x){
int vis[MAX];
memset(vis,0,sizeof(vis));
queue <int> q;
q.push(x);
int last=x;
int tail=x;
int layer=0;
while(!q.empty()){
int now=q.front();
q.pop();
vis[now]=1;
for(int i=0;i<node[now].size();i++){
int k=node[now][i];
if(vis[k]==0){
tail=k;
q.push(k);
}
}
if(last==now){
last=tail;
layer++;
}
}
return layer;
}
int main(){
freopen("in.txt","r",stdin);
memset(tree,-1,sizeof(tree));
scanf("%d",&n);
//建立并查集,必须大存小,否则出错
for(int i=1;i<n;i++){
int a,b;
scanf("%d %d",&a,&b);
if(a>b){
int tmp=a;
a=b;
b=tmp;
}
tree[b]=a;
node[a].push_back(b);
}
int cnt=0;
int travel[MAX];
int cnttra=0;
for(int i=1;i<=n;i++){
if(tree[i]==-1){
cnt++;
}
if(node[i].size()==0){
travel[cnttra++]=i;
}
}
if(cnt!=1){
printf("Error: %d components\n",cnt);
}else{
//建立无向图,把树当做图来遍历
//要根据tree建立,而不是node这样会把弄得弄乱
for(int i=1;i<=n;i++){
if(tree[i]!=-1){
node[i].push_back(tree[i]);
}
}
int maxx=0;
for(int i=0;i<cnttra;i++){
int tmp=bfs(travel[i]);
if(tmp>maxx){
maxx=tmp;
ans.clear();
ans.insert(travel[i]);
}else if(tmp==maxx){
ans.insert(travel[i]);
}
}
for(set<int>::iterator it=ans.begin();it!=ans.end();it++){
printf("%d\n",*it);
}
}
return 0;
}