最后一个case没有过,改
天再找找为什么
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#define MAXN 10008
using namespace std;
int n,k,first,last,level;
int Father[MAXN];// 并查集
int Depth[MAXN];
int visited[MAXN];
queue <int>q;
vector <int> v[MAXN];//
vector <int> ans;
int FindFather(int n){
if(Father[n]==-1){
return n;
}else{
Father[n]=FindFather(Father[n]);
}
return Father[n];
}
void Union(int a,int b){
int Fa=FindFather(a);
int Fb=FindFather(b);
if(a!=b){
Father[b]=Fa;//两个集合的合并完成
}
}
void BFS(int root){
while(!q.empty()){
first=q.front();
int tmp=q.front();
// printf("tmp=%d\n",tmp);
for(int i=0;i<v[tmp].size();i++){
if(!visited[v[tmp][i]])
{
q.push(v[tmp][i]);
visited[v[tmp][i]]=1;
}
}
if(first==last){
level++;
// printf("%d's level=%d\n",root,level);
last=q.back();
}
q.pop();
}
}
int main(){
freopen("in.txt","r",stdin);
scanf("%d",&n);
memset(Father,0xff,sizeof(Father));
for(int i=0;i<n-1;i++){//n-1条边 ,建立并查集的时候顺便建立邻接链表
int a,b;
scanf("%d%d",&a,&b);
Union(a,b);
v[a].push_back(b);
v[b].push_back(a);
}
for(int i=1;i<=n;i++){ //一定要记得节点下标1开始
if(Father[i]==-1)//找到一个根节点,连通分支shu++
k++;
}
if(k==1){
/* for(int i=1;i<=n;i++){
printf("%d->",i);
for(int j=0;j<v[i].size();j++)
printf("%d ",v[i][j]);
puts("");
}*///邻接链表和Tree都正确
int max=0;
for(int i=1;i<=n;i++){ //每个节点都BFS过去,记录每个节点为跟的时候的深度 ,下标1开始
q.push(i);
last=q.back();
level=0;//数之前先置0
memset(visited,0,sizeof(visited));
visited[i]=1;
BFS(i);
if(max<level){
max=level;
}
Depth[i]=level;
// printf("max=%d\n",max);
}
for(int i=1;i<=n;i++){
if(Depth[i]==max){
printf("%d\n",i);
}
}
}else{//存在多个连通分量
printf("Error: %d components\n",k);
}
return 0;
}
天再找找为什么