树的重心的定义:

在一棵树中,找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡。

通俗来说就是以这个点为根节点,找到他最大的衣蛾子树,然后让这个子树最小。

例题加模板:

POJ 1655

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int N=2E4+;
vector<int >ve[N];
bool mark[N]; int ans=N,pos;
int n; int dfs(int x){
mark[x]=;
int sum=;//sum为以x为根节点,其包含的点的总数目。
int s=;
for(int i=;i<ve[x].size();i++){
if(mark[ve[x][i]]) continue ;
int x1=dfs(ve[x][i]);
s=max(s,x1);//
sum+=x1;
}
s=max(s,n-sum-);//以x为根节点,s是X下边的点集的最大值,n-sum-1是x点上边的点集的最大值
// ans=min(ans,s);//最大子树最小if(s<=ans){
if(s==ans){
pos=min(pos,x);
}
else {
ans=s;
pos=x;
}
}
return sum+;
}
void solve()
{
ans=N;
memset(mark,,sizeof mark);
cin>>n;
int x,y;
for(int i=;i<=n;i++) ve[i].clear();
for(int i=;i<=n-;i++){
cin>>x>>y;
ve[x].push_back(y);
ve[y].push_back(x);
}
dfs();
cout<<pos<<" "<<ans<<endl;
}
int main(){
ios::sync_with_stdio();
int t;
cin>>t;
while(t--) solve();
return ;
}

树的重心的一些性质:

1 树上所有的点到重心的距离和最小,可能会有两个重心,此时到这两个重心的距离和最小

2 把两棵树通过一条边相连,新的树的重心在原来两棵树重心的连线上。
3 一棵树添加或者删除一个节点,树的重心最多只移动一条边的位置。

4 一棵树最多有两个重心,并且这两个重心相邻

关于树的重心--POJ 1655的更多相关文章

  1. 求树的重心 poj 1655

    题目链接:https://vjudge.net/problem/POJ-1655 这个就是找树的重心,树的重心就是树里面找一个点,使得以这个点为树根的所有的子树中最大的子树节点数最小.题目应该讲的比较 ...

  2. POJ 1655 Balancing Act&&POJ 3107 Godfather(树的重心)

    树的重心的定义是: 一个点的所有子树中节点数最大的子树节点数最小. 这句话可能说起来比较绕,但是其实想想他的字面意思也就是找到最平衡的那个点. POJ 1655 题目大意: 直接给你一棵树,让你求树的 ...

  3. POJ 1655 求树的重心

    POJ 1655 [题目链接]POJ 1655 [题目类型]求树的重心 &题意: 定义平衡数为去掉一个点其最大子树的结点个数,求给定树的最小平衡数和对应要删的点.其实就是求树的重心,找到一个点 ...

  4. POJ.1655 Balancing Act POJ.3107 Godfather(树的重心)

    关于树的重心:百度百科 有关博客:http://blog.csdn.net/acdreamers/article/details/16905653 1.Balancing Act To POJ.165 ...

  5. POJ 1655 - Balancing Act - [DFS][树的重心]

    链接:http://poj.org/problem?id=1655 Time Limit: 1000MS Memory Limit: 65536K Description Consider a tre ...

  6. POJ 1655 BalanceAct 3107 Godfather (树的重心)(树形DP)

    参考网址:http://blog.csdn.net/acdreamers/article/details/16905653   树的重心的定义: 树的重心也叫树的质心.找到一个点,其所有的子树中最大的 ...

  7. poj 1655 Balancing Act(找树的重心)

    Balancing Act POJ - 1655 题意:给定一棵树,求树的重心的编号以及重心删除后得到的最大子树的节点个数size,如果size相同就选取编号最小的. /* 找树的重心可以用树形dp或 ...

  8. poj 1655 Balancing Act 求树的重心【树形dp】

    poj 1655 Balancing Act 题意:求树的重心且编号数最小 一棵树的重心是指一个结点u,去掉它后剩下的子树结点数最少. (图片来源: PatrickZhou 感谢博主) 看上面的图就好 ...

  9. POJ 1655 Balancing Act【树的重心模板题】

    传送门:http://poj.org/problem?id=1655 题意:有T组数据,求出每组数据所构成的树的重心,输出这个树的重心的编号,并且输出重心删除后得到的最大子树的节点个数,如果个数相同, ...

随机推荐

  1. hdu1495 倒水bfs

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1495/ 题意:给定三个杯子S,M,N,满足S=M+N,现在要求用最短的次数将S杯中的饮倒平分到两个杯子中.我们首 ...

  2. 【2019HDU多校】第九场1006/HDU6685-Rikka with Coin——位运算打表

    题目链接 题目大意 使用10.20.50.100元面额的硬币能分别组成题目给出的面额,需要最少的硬币个数 分析 一开始队友想用一堆if-else解决问题,然后WA了无数发-- 我想到了一种比较简单的打 ...

  3. 如何让Docker镜像飞起来

    前言 Docker用起来非常爽,尤其是用于DevOps实践时.但是,当你在国内或者本地拉取镜像时,经常会碰到各种“便秘”——要么镜像拉取缓慢,要么时断时连,要么连接超时! 当我们的镜像又比较大时(比如 ...

  4. 常见排序算法总结分析之选择排序与归并排序-C#实现

    本篇文章对选择排序中的简单选择排序与堆排序,以及常用的归并排序做一个总结分析. 常见排序算法总结分析之交换排序与插入排序-C#实现是排序算法总结系列的首篇文章,包含了一些概念的介绍以及交换排序(冒泡与 ...

  5. Building Applications with Force.com and VisualForce(Dev401)( 九):Designing Applications for Multiple Users: Putting It All Together

    Module Objectives1.Apply profiles, organization wide defaults, role hierarchy and sharing to given a ...

  6. 构建安全可靠的微服务 | Nacos 在颜铺 SaaS 平台的应用实践

    作者 | 殷铭  颜铺科技架构师 本文整理自架构师成长系列 3 月 19 日直播课程. 关注"阿里巴巴云原生"公众号,回复 "319",即可获取对应直播回放链接 ...

  7. 从本地方法栈看到jni调用

    我们都知道java虚拟机所管理的内存区域包括方法区,堆,虚拟机栈,本地方法栈,程序计数器. 在<深入理解java虚拟机>中,周志明老师对虚拟机栈进行了讲解,但是对本地方法栈却一笔带过.今天 ...

  8. Python python对象 deque

    # deque对象 ''' class collections.deque([ iterable [,maxlen ] ] ) 返回一个从左到右(使用append())初始化的新deque对象,其中包 ...

  9. 关于visocode 自动保存时自动添加分号问题

    先下载插件:  Vueter 打开设置的配置文件,写入一下代码: // //是否需要保存时自动格式化 "editor.formatOnSave": true, //使js 文件保存 ...

  10. Java中的get()方法和set()方法

    在Java中,为了数据的安全,换句话说就是为了隐藏你的代码的一些实现细节,我们会用private来修饰属性,使用private修饰的属性就不能被其他类直接访问了,想要访问就需要通过set.get方法: ...