先判断是不是树,并查集和深搜都可以
求树的直径,两遍搜索,答案为其合集。
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
const int MAXN = 10010;
vector<int> mp[MAXN];
bool vis[MAXN];
int num = 0;
int len = 0;
int dep[MAXN];
void book(int x) {
vis[x] = true;
for (int i = 0; i < mp[x].size(); i++)
if (!vis[mp[x][i]])
book(mp[x][i]);
}
void dfs(int f, int x, int d) {
dep[x] = d;
for (int i = 0; i < mp[x].size(); i++)
if (mp[x][i] != f)
dfs(x, mp[x][i], d+1);
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i < n; i++) {
int x, y;
scanf("%d%d", &x, &y);
mp[x].push_back(y);
mp[y].push_back(x);
}
memset(vis, false, sizeof(vis));
for (int i = 1; i <= n; i++)
if (!vis[i]) {
num++;
book(i);
}
if (num > 1) {
printf("Error: %d components\n", num);
return 0;
}
set<int> s;
dfs(0, 1, 0);
int tmp = 1, ma = 0;
for (int i = 2; i <= n; i++)
if (dep[i] > ma) {
ma = dep[i];
tmp = i;
}
for (int i = 1; i <= n; i++)
if (dep[i] == ma)
s.insert(i);
dfs(0, tmp, 0);
ma = 0;
for (int i = 1; i <= n; i++)
ma = max(ma, dep[i]);
for (int i = 1; i <= n; i++)
if (dep[i] == ma)
s.insert(i);
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
printf("%d\n", *it);
return 0;
}