题意
求一棵树的多个重心并按照字典序输出
题解
求树的重心
调试记录
无
#include <cstdio>
#include <algorithm>
#define maxn 500005
#define INF 0x3f3f3f3f
using namespace std;
int first[maxn], next[maxn * 2];
int to[maxn * 2], tot = 0;
int size[maxn], ans[maxn], n, min_max_subtree = INF;
void AddEdge(int x, int y){
++tot;
to[tot] = y;
next[tot] = first[x];
first[x] = tot;
}
void FindCentre(int x, int parent){
size[x] = 1;
int max_subtree = 0;
for (int i = first[x]; i; i = next[i]){
if (to[i] != parent){
FindCentre(to[i],x);
size[x] += size[to[i]];
max_subtree = max(max_subtree, size[to[i]]);
}
}
max_subtree = max(max_subtree, n-size[x]);
if (max_subtree < min_max_subtree){
min_max_subtree = max_subtree;
ans[0] = 0;
ans[++ans[0]] = x;
}
else if (max_subtree == min_max_subtree) ans[++ans[0]] = x;
}
int main(){
scanf("%d", &n);
for (int x, y, i = 1; i <= n - 1; i++){
scanf("%d%d", &x, &y);
AddEdge(x, y); AddEdge(y, x);
}
FindCentre(1, 0);
sort(ans + 1, ans + ans[0] + 1);
for (int i = 1; i <= ans[0]; i++) printf("%d ", ans[i]);
printf("\n");
return 0;
}