私の考えは、DFSを2回使用することです。最初は、接続されたサブグラフの数を判別するために使用されます。複数ある場合は、ツリーを形成できないことを意味し、接続されたサブグラフの数を出力して、プログラムを終了します。
2番目の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;
}