一、题目概述&样例
略;
二、思路
STEP1:求连通分量数, 若不唯一则不是树
连通分量数即访问所有顶点需要的DFS/BFS次数;
STEP2:求各顶点为根时树的深度
求深度DFS或BFS均可
DFS方案代码量较小,因此选用;
void DFS( int v, int d, int &max_d )
{
visited[v] = 1;
if( max_d < d )
max_d = d;
for( int i = 0; i < G[v].size(); ++i )
if( !visited[ G[v][i] ] )
DFS( G[v][i], d + 1, max_d );
}
BFS方案类似于树的层序遍历记录层数;
三、代码
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int>> G(10001);
vector<int> visited(10001);
void DFS( int v, int d, int &max_d )
{
visited[v] = 1;
if( max_d < d )
max_d = d;
for( int i = 0; i < G[v].size(); ++i )
if( !visited[ G[v][i] ] )
DFS( G[v][i], d + 1, max_d );
}
int main()
{
int N, max = 0, cnt = 0;
vector<int> ans;
scanf("%d", &N);
for( int i = 1, v1, v2; i < N; ++i )
{
scanf("%d %d", &v1, &v2);
G[v1].push_back(v2);
G[v2].push_back(v1);
}
for( int i = 1; i <= N; ++i )
if( !visited[i] )
{
DFS( i, 1, max );
++cnt;
}
if( cnt != 1 )
{
printf("Error: %d components", cnt);
return 0;
}
for( int i = 1, d, cnt; i <= N; ++i )
{
d = 1, cnt = 0;
fill( visited.begin(), visited.end(), 0 );
DFS( i, 1, d );
if( max < d )
{
max = d;
ans.clear();
ans.push_back(i);
}
else if( max == d )
ans.push_back(i);
}
for( int i = 0; i < ans.size(); ++i )
printf("%d\n", ans[i]);
}