| 比赛 |
2025.12.13 |
评测结果 |
AAAAATTTTTTTTTTTTTTT |
| 题目名称 |
树的重心 |
最终得分 |
25 |
| 用户昵称 |
淮淮清子 |
运行时间 |
47.418 s |
| 代码语言 |
C++ |
内存使用 |
12.51 MiB |
| 提交时间 |
2025-12-13 12:25:31 |
显示代码纯文本
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 300005;
vector<vector<pii> > adj;
pii e[N];
int be;
bool v[N], ic[N];
int ca[N], cs, m, tt, sc;
void dfs1(int u){
v[u] = 1;
ca[cs ++] = u;
for(pii& p : adj[u]){
int vv = p.first, ei = p.second;
if(!v[vv] && ei != be){
dfs1(vv);
}
}
}
int dfs2(int u, int fa){
int sz = 1;
for(pii& p : adj[u]){
int w = p.first, ei = p.second;
if(w == fa || ei == be || !ic[w]){
continue;
}
int sb = dfs2(w, u);
sz += sb;
m = max(m, sb);
}
tt = sz;
return sz;
}
ll gs(){
ll r = 0;
for(int i = 0;i < cs;++ i){
int u = ca[i];
m = 0, tt = 0;
dfs2(u, -1);
m = max(m, sc - tt);
if(m <= sc / 2) r += u;
}
return r;
}
void init(int n){
adj.clear();
adj.resize(n + 1);
memset(v, 0, sizeof(v));
memset(ic, 0, sizeof(ic));
cs = 0;
}
int main(){
freopen("centroid.in", "r", stdin);
freopen("centroid.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
int T; cin >> T;
while(T --){
int n; cin >> n;
init(n);
for(int i = 0;i < n - 1;++ i){
int u, vv; cin >> u >> vv;
e[i] = {u, vv};
adj[u].emplace_back(vv, i);
adj[vv].emplace_back(u, i);
}
ll a = 0;
for(int i = 0;i < n - 1;++ i){
be = i;
int u = e[i].first, vv = e[i].second;
memset(v, 0, sizeof(v));
cs = 0; dfs1(u); sc = cs;
memset(ic, 0, sizeof(ic));
for(int j = 0;j < cs;++ j){
ic[ca[j]] = 1;
}
a += gs();
memset(v, 0, sizeof(v));
cs = 0; dfs1(vv); sc = cs;
memset(ic, 0, sizeof(ic));
for(int j = 0;j < cs;++ j){
ic[ca[j]] = 1;
}
a += gs();
}
cout << a << '\n';
}
return 0;
}