您的位置:首页 > 其它

Balancing Act 树的重心模板题

2019-08-15 14:41 85 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_43279710/article/details/99635440

Consider a tree T with N (1 <= N <= 20,000) nodes numbered 1…N. Deleting any node from the tree yields a forest: a collection of one or more trees. Define the balance of a node to be the size of the largest tree in the forest T created by deleting that node from T.
For example, consider the tree:

Deleting node 4 yields two trees whose member nodes are {5} and {1,2,3,6,7}. The larger of these two trees has five nodes, thus the balance of node 4 is five. Deleting node 1 yields a forest of three trees of equal size: {2,6}, {3,7}, and {4,5}. Each of these trees has two nodes, so the balance of node 1 is two.
For each input tree, calculate the node that has the minimum balance. If multiple nodes have equal balance, output the one with the lowest number.

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int N = 202020;

int Next[N], head[N], ver[N], v[N], size[N];
int tot, pos, ans, n;

void init(){
memset(Next, 0, sizeof(Next));
memset(head, 0, sizeof(head));
memset(v, 0, sizeof(v));
memset(size, 0, sizeof(size));
tot = 1;
ans = 0x7fffffff;
}
void add(int x, int y){
ver[++tot] = y, Next[tot] = head[x], head[x] = tot;
}

void dfs(int x){
v[x] = 1; size[x] = 1;
int max_part = 0;
for (int i = head[x]; i; i = Next[i]){
int y = ver[i];
if(v[y]) continue;
dfs(y);
size[x] += size[y];
max_part = max(max_part, size[y]);
}
max_part = max(max_part, n - size[x]);
if(max_part < ans){
ans = max_part;
pos = x;
}
}
int main(){
int t;
init();
scanf("%d", &t);
while(t--){
init();
scanf("%d", &n);
for(int i = 1; i < n; i++){
int a, b;
scanf("%d%d", &a, &b);
add(a, b);
add(b, a);
}
dfs(1);
printf("%d %d\n", pos, ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: