首页 > 其他分享 >树的重心

树的重心

时间:2023-08-06 10:33:06浏览次数:36  
标签:子树 重心 int 子树中 为根 节点

树的重心:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡。使得以该节点为根的子树中,最大子树高度最小的节点  

//会议
//https://www.luogu.com.cn/problem/P1395

// f数组:f数组用于记录以每个节点为根的子树中的最大深度(高度)。对于每个节点u,f[u]表示以u为根的子树的最大深度。

// g数组:g数组用于记录以每个节点为根的子树中,u的子节点(不包括u本身)到其他叶子节点的最大距离(即最长路径)。
// 对于每个节点u,g[u]表示以u为根的子树中,u的子节点到其他叶子节点的最大距离。

//树的重心:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡。
//树的重心是使得以该节点为根的子树中,最大子树高度最小的节点
//根据重心定义,
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,res,f[N],g[N],num,ans=2e9;
int e[N],ne[N],h[N],idx;
bool vis[N];
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u)
{
    vis[u]=true;
    for(int i=h[u];~i;i=ne[i]){
        int j=e[i];
        if(!vis[j]){
            dfs(j);
            g[u]+=g[j]+1;
            f[u]=max(f[u],g[j]+1);
        }
    }
    f[u]=max(f[u],n-g[u]-1);
    vis[u]=false;
}
int main()
{
    cin>>n;
    memset(h, -1, sizeof h);
    for(int i=0;i<n-1;i++){
        int a,b;
        cin>>a>>b;
        add(a,b),add(b,a);
    }
    dfs(1);//以任意一个节点开始,寻找树的重心
    cout<<f[1]<<endl;
    for(int i=1;i<=n;i++)
        if(ans>f[i]) num=i,ans=f[i];
    cout<<num<<" ";
    memset(g,0,sizeof(g));
    dfs(num);//重置,搜索重心
    for(int i=1;i<=n;i++) res+=g[i];
    cout<<res<<endl;
    return 0;
}

 

标签:子树,重心,int,子树中,为根,节点
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17609144.html

相关文章

  • FJOI 树的重心题解
    从零开始暴切省选题题意简述给定一个\(n\)个点的树,每个点的编号从\(1\)至\(n\),问这个树有多少不同的连通子树,和这个树有相同的重心。分析1求重心首先要明确重心的定义。题目中给出:删掉某点\(i\)后,若剩余\(k\)个连通分量,那么定义\(d(i)\)为这些连通分量中点的个数......
  • 求树的重心
    题目:http://poj.org/problem?id=1655题意:给定一棵树,求树的重心的编号以及重心删除后得到的最大子树的节点个数size,如果size相同就选取编号最小的.分析:首先要知道什么是树的重心,树的重心定义为:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删......
  • HDU3662(求三维凸包表面的多边形个数,表面三角形个数,体积,表面积,凸包重心,凸包中点到面
    题目:3DConvexHull题意:给定空间中的n个点,求这n个点形成的凸包的表面的多边形个数。增量法求解:首先任选4个点形成的一个四面体,然后每次新加一个点,分两种情况:1>在凸包内,则可以跳过2>在凸包外,找到从这个点可以"看见"的面S(看不看得见可以用法向量,看点是否在面外侧),删除这些......
  • 9.重心与吊装
    重心与起重作业的关系重心就是物体分割成许多微小体积的重力的合力中心。重心与起重作业的安全关系重大,在起重安全施工规范中明确地规定:吊钩作用线与重物的重心必须在同一条垂直线上。物体的重心位置是进行起重施工所必须掌握的重要技术数据之一。重心与起重作业的关......
  • CF1824B2 LuoTianyi and the Floating Islands (Hard Version) - 概率期望 - 树的重心
    题目链接:https://codeforces.com/contest/1824/problem/B2题解:考虑一棵\(n\)个点的树,假如已经选定了\(k\)个特殊点,如何判断某一个点是否为好点?显然将这个点提到根没有影响,那么好点的充要条件是对于所有子树的\(S_u\)值都\(\leqk/2\),这里\(S\)代表\(u\)子树中的特殊......
  • 产品经理-基础-重心-误区
    基础1、视野(扩展)、国内外产品资料2、表达能力(笔记、草稿)3、技术:前端H5.......4、逻辑思维:设计与用户使用是否缺陷5、基础电脑操作重心1、实操2、认识外-->内,重点难点3、流程误区1、盲从、信大厂2、捞针,无目的3、重工具(要注重整体)、RP......
  • 人物速写随笔-重心
    通常重心线是第七节椎骨的垂直线 ......
  • 树的重心
    定义:1.找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心。2.以这个点为根,那么所有的子树(不算整个树自身)的大小都不超过整个树大小的一半。性质:1.树......
  • POJ 1655 Balancing Act 树的重心
    BalancingActTimeLimit: 1000MS MemoryLimit: 65536KTotalSubmissions: 16866 Accepted: 7130DescriptionConsideratreeTwithN(1<=N<=20,000)nodesnu......
  • 【题解】P5666 [CSP-S2019] 树的重心
    感觉对重心的理解更直观了一点。题意求一棵树上删去每一条边后两侧子树重心的编号和。\(n\leq3\times10^5\)思路神奇的清真数论。首先这里有一步很妙的操作:把整......