我的思路是用两次DFS,第一次用来判断有几个连通子图,如果超过1个就说明不能构成树,输出连通子图数量并结束程序。
第二次DFS是在这个图已经是确定能构成树的情况下,记录下每个结点作根时它的最大层数,最后循环找出最大层数的结点。
#include <cstdio>
#include <vector>
using namespace std;
struct Node{
int v;
int layer;
}node[10010];
int n;
bool vis[10010];
vector<int> adj[10010];
int rootlayer[10010] = {
0};
void init(){
for(int i=0; i<10010; i++){
vis[i] = false;
node[i].layer = 0;
}
}
void DFS(int index){
vis[index] = true;
for(int i=0; i<adj[index].size(); i++){
int temp = adj[index][i];
if(!vis[temp])
DFS(adj[index][i]);
}
}
void DFS2(int index, int layer, int &maxlayer){
node[index].layer = layer;
if(layer > maxlayer){
maxlayer = layer;
}
vis[index] = true;
for(int i=0; i<adj[index].size(); i++){
int temp = adj[index][i];
if(!vis[temp])
DFS2(temp, layer+1, maxlayer);
}
}
int main(){
scanf("%d", &n);
for(int i=0; i<n-1; i++){
int a, b;
scanf("%d %d", &a, &b);
adj[a].push_back(b);
adj[b].push_back(a);
}
init();
int num = 0;
for(int i=1; i<=n; i++){
if(!vis[i]){
DFS(i);
num++;
}
}
if(num != 1){
printf("Error: %d components", num);
return 0;
}
int MAX = -1;
for(int i=1; i<=n; i++){
init();
int maxlayer = 0;
if(!vis[i]){
DFS2(i, 1, maxlayer);
}
rootlayer[i] = maxlayer;
if(maxlayer > MAX){
MAX = maxlayer;
}
}
for(int i=1; i<=n; i++){
if(rootlayer[i] == MAX){
printf("%d\n", i);
}
}
return 0;
}