树的重心——树的结构

news/2024/7/20 20:25:12 标签: 深度优先, 算法

树的重心是指对于某个点,将其删除后,可以使得剩余联通块的最大值最小。也就等价于一某个点为根的树,将根删除后,剩余的若干棵子树的大小最小。

例如下图的树的重心就是2。

性质:

        性质一:重心的若干棵子树打大小一定小于等于 n/2(n为总节点个数)。除了重心以外的所有其他点,都必然存在一棵节点个数大于 n/2 的子树。

        性质二:一棵树至多有两个重心,如果存在两个重心,则必然相邻。将脸两个重心的边删除后,一定划分为两棵大小相等的树。

        性质三:树中所有点到重心的距离和是最小的。如果有两个重心,那么到他们的距离和一样,反之,距离和最小的点一定是重心。 

 求重心的方法:

mss[ ]表示x点所有子树大小的最大值,即如下图所示,其实2的子树大小的最大值为2。

package lanqiao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

/**
 * 2024/3/31 10:08
 */
public class lanqiao_树的重心 {
    static int n;
    static List<Integer>[] list;
    static List<Integer> res;
    static int[] sz;
    static int[] mss;
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        n=scan.nextInt();
        res=new ArrayList<>();
        sz=new int[n+1];
        mss=new int[n+1];
        list=new List[n+1];
        for (int i = 0; i < n + 1; i++) {
            list[i]=new ArrayList<>();
        }
        for (int i=0;i<n-1;i++){
            int x=scan.nextInt();
            int y=scan.nextInt();
            list[x].add(y);
            list[y].add(x);
        }
        dfs(1,0);
        System.out.println("该树的重心为:");
        for (int i = 0; i < res.size(); i++) {
            System.out.print(res.get(i)+" ");
        }
        System.out.println();
    }
    public static void dfs(int x,int father){
        sz[x]=1;
        mss[x]=0;
        for (int y:list[x]){
            if (y==father)
                continue;
            dfs(y,x);
            sz[x]+=sz[y];//不断找x的各种不同子树
            mss[x]=Math.max(mss[x],sz[y]);//找出x点的子树大小的最大值
        }
        mss[x]=Math.max(mss[x],n-sz[x]);//比较x的子树,和除x及其子树的另一棵树的大小,取出最大值
        if (mss[x]<=n/2)//应用性质一
            res.add(x);
    }
}

 运行结果:

6
5 1
1 4
6 3
2 6
6 1
该树的重心为:
6 1 

Process finished with exit code 0


http://www.niftyadmin.cn/n/5461714.html

相关文章

SQLAlchemy 建立数据库模型之间的关系

常见关系&#xff1a; 一对多关系多对一关系多对多关系一对一关系 一对多关系&#xff08;一个作者&#xff0c;多篇文章&#xff09; ## 一对多关系&#xff0c;单作者-多文章&#xff0c;外键不可少 ## 外键(ForeignKey)总在多的那边定义,关系(relationship)总在单的那边定…

Linux(centos7)部署hive

前提环境: 已部署完hadoop(HDFS 、MapReduce 、YARN) 1、安装元数据服务MySQL 切换root用户 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysqL-2022 # 安装Mysql yum库 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm # yu…

Docker 哲学 - compose.yaml 指令

compose.yaml 的 image commond working_dir 和 dockerfile的 from cmd workdir 区别在哪里 。为什么 dockerfile制定过了。compose还要再写一个。是处于个性化还是 有不同的意义 如果 dockerfile 的 from 是 node:16 &#xff0c;compose.yaml 的 images 是 node:18 那么 直接…

JeeSite Vue3:前端如何实现权限管理

随着技术的飞速发展&#xff0c;前端开发技术日新月异。在这个背景下&#xff0c;JeeSite Vue3 作为一个基于 Vue3、Vite、Ant-Design-Vue、TypeScript 和 Vue Vben Admin 的前端框架&#xff0c;引起了广泛关注。它凭借其先进的技术栈和丰富的功能模块&#xff0c;为初学者和团…

使用 SQLite数据库,磁盘数据库,也叫本地数据库

建库与表 1查看 2删除 3修改 4增加 建立 # 只运行一次&#xff0c;建立库与表。 import sqlite3 import os import sysif os.path.exists(abc.db):print(abc.db已经存在&#xff0c;不需要再建立)sys.exit(1)conn sqlite3.connect(abc.db) curs conn.cursor() curs.execute(&…

240330-大模型资源-使用教程-部署方式-部分笔记

A. 大模型资源 Models - Hugging FaceHF-Mirror - Huggingface 镜像站模型库首页 魔搭社区 B. 使用教程 HuggingFace HuggingFace 10分钟快速入门&#xff08;一&#xff09;&#xff0c;利用Transformers&#xff0c;Pipeline探索AI。_哔哩哔哩_bilibiliHuggingFace快速入…

江协STM32:点亮第一个LED灯和流水灯

很多单片机都是高电平弱驱动&#xff0c;低电平强驱动&#xff0c;所以这里是低电平有效 点亮一个LED灯 操作STM32的GPIO需要三个操作&#xff1a; 第一个使用RCC开启GPIO的时钟 第二步使用GPIO_Init函数初始化GPIO 第三步使用输出或输入函数控制GPIO 1.使用RCC开启GPIO的时…

亚马逊云科技—云从业者认证考试限时 50% 折扣优惠 限量提供, 先到先得!

亚马逊云科技云从业者认证&#xff08;AWS Certified Cloud Practitioner&#xff09;作为全球热门的云基础认证, 对于寻求基础云知识的开发者、专业人士、学生, 以及没有技术背景的职场人士来说, 都是进阶亚马逊云认证之旅的良好起点并助您进一步提升职场竞争力&#xff01; 与…