解题思路:这题真的让我认识到使用STL效率确实不高。打过CCCC天梯赛,都懒得自己写数据结构了,ACM不行。一开始我用vector来表示数,2s超时,然后用结构体表示,降到594ms.然后把记录的q也从vector改成数组,再降低一百毫秒。
这道题其实就是求重心,以前在树的分治中,为了确保分治效率也用过。详见我树的分治那一段的题解吧
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
#define N 50003
#define inf 0x3f3f3f3f
using namespace std;
struct node
{
int v,next;
} s[N<<1];
int q[N];
int p[N],f[N],r,n,head[N],cnt,num;
void sc(int u,int pre)
{
f[u]=0;p[u]=1;
for(int i=head[u];i!=-1;i=s[i].next)
{
int v=s[i].v;
if(v==pre) continue;
sc(v,u);
f[u]=max(f[u],p[v]);
p[u]+=p[v];
}
f[u]=max(f[u],n-p[u]);
if(r>f[u])
{
num=0;
r=f[u];
q[num++]=u;
}else
if(r==f[u])
{
q[num++]=u;
}
}
void add_edge(int a,int b)
{
s[cnt].v=b;
s[cnt].next=head[a];
head[a]=cnt++;
s[cnt].v=a;
s[cnt].next=head[b];
head[b]=cnt++;
}
int main()
{
//freopen("t.txt","r",stdin);
int a,b;
scanf("%d",&n);
memset(head,-1,sizeof(head));
cnt=num=0;
for(int i=0;i<n-1;i++)
{
scanf("%d%d",&a,&b);
add_edge(a,b);
}
r=inf;
sc(1,-1);
sort(q,q+num);
for(int i=0;i<num;i++)
{
printf("%d ",q[i]);
}
return 0;
}