| 比赛 |
2025.12.13 |
评测结果 |
AAAAAAAAEEEEEEEEEEEE |
| 题目名称 |
树的重心 |
最终得分 |
40 |
| 用户昵称 |
梦那边的美好TE |
运行时间 |
5.661 s |
| 代码语言 |
C++ |
内存使用 |
3.60 MiB |
| 提交时间 |
2025-12-13 12:25:10 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=2005;
int T,n,ans,u[N],v[N],now,siz[N],mx[N];
vector<int>G[N];
void add(int x,int y){
G[x].push_back(y);
}
void dfs1(int x,int fa){
siz[x]=1;
for(auto y:G[x]){
if(y==fa)continue;
dfs1(y,x);
siz[x]+=siz[y];
}
return;
}
void dfs2(int x,int fa,int rt){
for(auto y:G[x]){
if(y==fa)continue;
dfs2(y,x,rt);
mx[x]=max(mx[x],siz[y]);
}
mx[x]=max(mx[x],siz[rt]-siz[x]);
now=min(now,mx[x]);
return;
}
void dfs3(int x,int fa){
if(mx[x]==now)ans+=x;
for(auto y:G[x]){
if(y==fa)continue;
dfs3(y,x);
}
return;
}
void calc(int rt){
now=1e9;
dfs1(rt,0);
dfs2(rt,0,rt);
dfs3(rt,0);
return;
}
void clear(){
for(int i=1;i<=n;i++)G[i].clear(),siz[i]=0,mx[i]=0;
return;
}
void work(){
scanf("%d",&n);
for(int i=1;i<n;i++)scanf("%d %d",u+i,v+i);
for(int i=1;i<n;i++){
for(int j=1;j<i;j++){
add(u[j],v[j]);
add(v[j],u[j]);
}
for(int j=i+1;j<n;j++){
add(u[j],v[j]);
add(v[j],u[j]);
}
calc(u[i]);
calc(v[i]);
clear();
}
printf("%d\n",ans);
ans=0;
return;
}
int main(){
freopen("centroid.in","r",stdin);
freopen("centroid.out","w",stdout);
scanf("%d",&T);
while(T--)work();
return 0;
}