超时+错误
标准思路
⾸先深度优先搜索判断它有⼏个连通分量。如果有多个,那就输出Error: x components,如果只
有⼀个,就两次深度优先搜索,先从⼀个结点dfs后保留最⾼⾼度拥有的结点们,然后从这些结点中的其中任意⼀个开始dfs得到最⾼⾼度的结点们,这两个结点集合的并集就是所求
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
const int maxn = 1e4 + 10;
vector<int> G[maxn];
int visit[maxn] = { 0 };
set<int> ans;
int n,Max = -1;
//深度遍历求高度
void dfs(int k, int d) {
visit[k] = 1;
/*if (G[k].size() == 1) {
if (d > Max) {
ans.clear();
ans.insert(k);
Max = d;
}
else if (d == Max) { ans.insert(k); }
}*/
for (int i = 0; i < G[k].size(); i++) {
if (visit[G[k][i]] == 0) {
dfs(G[k][i], d + 1);
}
}
if (d > Max) {
ans.clear();
ans.insert(k);
Max = d;
}
else if (d == Max) { ans.insert(k); }
}
//并查集确定子图数
int father[maxn];
int findFather(int x) {
while(x != father[x]) {
x = father[x];
}
return x;
}
void merge(int a, int b) {
int Fa = findFather(a);
int Fb = findFather(b);
if (Fa != Fb) {
father[Fa] = Fb;
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) { father[i] = i; }
for (int i = 1; i < n; i++) {
int p, q;
cin >> p >> q;
merge(p, q);
G[p].push_back(q);
G[q].push_back(p);
}
int cnt = 0;
for (int i = 1; i <= n; i++) {
if (father[i] == i) { cnt++; }//使用并查集会导致第二点错误,不知道为什么
}
if (cnt != 1) {
cout << "Error: " << cnt << " components";
return 0;
}
for (int i = 1; i <= n; i++) {
fill(visit, visit + maxn, 0);
if (G[i].size() == 1) { dfs(i, 0); }//只有度为1的点才有可能是所求点
}
for (auto i : ans) { cout << i << endl; }
return 0;
}