题意:给出一个n(表示1~n个人吧),然后在给出n-1行,每行一个u,v(表示u与v关联)要求该树的所有重心,按从小到大的顺序.
题解:这道题的数据专门卡STL的,无限TLE,只能改用链式前向星做.
代码如下:
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn = 1e5 + 500;
struct node
{
int to, next;
} edge[maxn];
int head[maxn];
bool vis[maxn];
int ans[maxn];
int son[maxn];
int n, top, id, maxsize;
void init()
{
id = 0, top = 0;
maxsize = inf;
memset(vis, 0, sizeof(vis));
memset(head, -1, sizeof(head));
}
void add(int u, int v)
{
edge[id].to = v;
edge[id].next = head[u];
head[u] = id++;
}
void dfs(int u)
{
vis[u] = 1;
son[u] = 0;
int maxson = 0;
for (int i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].to;
if (!vis[v])
{
dfs(v);
son[u] += son[v] + 1;
maxson = max(maxson, son[v] + 1);
}
}
maxson = max(maxson, n - son[u] - 1);
if (maxson < maxsize)
{
top = 1;
ans[0] = u;
maxsize = maxson;
}
else if (maxson == maxsize)
ans[top++] = u;
}
int main()
{
while (~scanf("%d", &n))
{
init();
for (int i = 0; i<n - 1; i++)
{
int u, v;
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
dfs(1);
sort(ans, ans + top);
for (int i = 0; i<top - 1; i++)
printf("%d ", ans[i]);
printf("%d\n", ans[top - 1]);
}
return 0;
}