【ACWING】【图的深度优先遍历】【846树的重心】

news2024/9/27 5:53:36

给定一颗树,树中包含 n个结点(编号 1∼n)和 n−1条无向边。

请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。

重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。

输入格式

第一行包含整数 n,表示树的结点数。
接下来 n−1行,每行包含两个整数 a和 b,表示点 a和点 b之间存在一条边。

输出格式

输出一个整数 m,表示将重心删除后,剩余各个连通块中点数的最大值。

数据范围

1≤n≤105

输入样例

9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6

输出样例:

4

这里我们首先需要确定的是我们的存储图的结构
这道题我们一定要用邻接表去存,如果不是邻接表的话,我们的会报memory limits的警告的。

然后这道题我们的思路就是图的深度优先遍历。
C++ 图的相关知识
当我们每遍历一个结点的时候,我们就将这个去掉这个节点之后,树所剩下的最大的连通块的大小给求出来。那我们怎么求呢?
比方说我们当前遍历到了我们下面红色圈圈起来的这个节点,我们将其删掉,那么我们需要知道它的三个子树的结点个数s1,s2,s3
然后只要我们将总的结点的个数减掉我们这个红圈的节点和s1,s2,s3,我们就能够得到这个红圈的上面的那一块连通图的结点个数s4
然后我们只要从s1,s2,s3,s4中找到最大的那一个sx就可以了。

然后对于每一个节点的sx,我们只需要找到最小的那一个smin并返回就可以了。
在这里插入图片描述

#include<iostream>
#include<vector>
#include<list>
using namespace std;
//定义我们的邻接表
vector<list<int>> record(1e5+10,list<int>{});
//创建一个记录有没有访问过的数组
vector<bool> visited(1e5+10,false);
int number;
int ans=1e5+10;
//用于添加我们的节点到邻接表中
//这里最好是头插到链表,这用时间复杂度比较小,否则容易超时
void add(int a,int b)
{
    record[a].push_front(b);
}

int dfs(int u){
//res是用来记录我们上面s1,s2,s3,s4中最小的那一个的
    int res=0;
    //标记当前节点已读
    visited[u]=true;
    //初始我们的sum就是1,因为我们当前的结点已经算进去了
    //sum是以当前节点为根的树的结点个数的和
    //主要是用于返回给上一层用的
    int sum=1;
    //按照邻接表遍历每一个结点
    for(auto &i:record[u])
    {
        int j=i;
        if(!visited[j])
        {
            int s=dfs(j);
            //寻找s1,s2,s3,s4中最大的那一个
            res=max(res,s);
            //计算节点和
            sum+=s;
        }
    }
    res=max(res,number-sum);
    //ans用来查找我们上面所说的smin
    ans=min(res,ans);
    return sum;
}
int main()
{

    cin>>number;
    int i=0;
    //注意这里我们的输入的边只有n-1条
    while(i++<number-1)
    {
        int n,m;
        cin>>n>>m;
        //注意我们的无向图的话,我们需要添加双向的边
        add(n,m);
        add(m,n);
    }
    //这里我们随便选一个节点进行深度优先遍历就可以了。
    dfs(1);
    cout<<ans<<endl;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/130806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js复习之正则表达式正向肯定与否定预查询

正则表达式(regular expression)描述了一种字符串匹配的模式&#xff08;pattern&#xff09;&#xff0c;可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。 正则表达式_百度百科 除开常用基本匹配模式&#xff0c;偶尔也会用到…

回顾艰难且不失温度的 2022 年 | 文中附「双12免单王」获奖名单

今天是 2022 年最后一天&#xff0c;回忆往昔&#xff0c;这一年经历了太多的不可思议和无可奈何之事。在年末的短短几周&#xff0c;寒气长驱直下以惊人的速度传给每一个人。我们真诚地希望大家都可以平安渡过这一难关。 即使步步难行&#xff0c;亦要踱步前行&#xff01;无…

力扣刷题记录——190. 颠倒二进制位、191. 位1的个数、202. 快乐数

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《190. 颠倒二进制位、191. 位1的个数、202. 快乐数》。 目…

Gradle学习笔记之依赖

文章目录依赖的方式直接依赖项目依赖本地jar包依赖依赖的类型api和implementation的区别依赖冲突及解决方案移除某个依赖不允许依赖传递强制使用某个版本依赖冲突时立刻构建失败依赖的方式 Gradle中的依赖方式有直接依赖、项目依赖和本地jar包依赖三种&#xff1a; dependenc…

【一起从0开始学习人工智能0x02】字典特征抽取、文本特征抽取、中文文本特征抽取

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录什么是特征工程&#xff1f;用什么做&#xff1f;1.特征提取特征值化&#xff1a;特征提取API字典特征提取---向量化---类别--》one-hot编码哑变量one-hot-------直接1234会产生歧义&#xff0c;不公平应用场…

Python 10k+ 面试试题,看看你是否掌握

前言 大家早好、午好、晚好吖 ❤ ~ 面试实战题&#xff1a;采集世界最大旅游平台Tripadvisor 另我给大家准备了一些资料&#xff0c;包括: 2022最新Python视频教程、Python电子书10个G &#xff08;涵盖基础、爬虫、数据分析、web开发、机器学习、人工智能、面试题&#xff…

Python GUI编程:音乐播放器(多线程、爬虫、进度条、文件)

文章目录1. 程序运行结果2.程序实现原理3. GUI布局4. 功能介绍5. 代码实现1. 程序运行结果 Python实现音乐播放器(爬虫、多线程、进度条、文件)2.程序实现原理 本音乐播放器GUI方面运用Python的tkinter实现&#xff0c;播放的音乐来自网络爬虫和本电脑已经有的。为了使整个程序…

Android studio设置全屏显示的两种方式

两种在Androidstudio中设置全屏的方式&#xff0c;推荐第二种 第一种&#xff08;Java文件中设置&#xff09; 直接在onCreate()函数中设置 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);package com.exa…

MARKETS AND MARKET LOGIC——The Market‘s Principles (6)_3

市场的组成——对行为观察的反思 制定市场理解 理解市场逻辑将有助于每个参与者提高其在市场上成功的可能性&#xff0c;因为他将能够阅读市场活动并接收市场生成的信息&#xff0c;这些信息很少有参与者承认或理解。这一信息特别涉及市场如何接受或拒绝随着时间的推移而升高或…

Linux用户标识符UID与GID和用户账号

1.用户标识符UID和GID UID 表示的是用户的标识&#xff08;User Identification&#xff09; GID 表示的是用户组的标识&#xff08;Group Identification&#xff09; 显示用户ID信息。 命令&#xff1a;id username 2.用户账号 用户和用户组的信息都存放在…

RabbitMQ(一)Windows下载安装

目录一、下载安装包二、安装erlang三、安装RabbitMQ四、配置RabbitMQ管理界面官网地址&#xff1a;https://www.rabbitmq.com/ 下载地址&#xff1a;https://www.rabbitmq.com/download.html 一、下载安装包 RabbitMQ Windows下载地址&#xff1a;https://www.rabbitmq.com/in…

001. Nginx场景,优点,组成部分和编译

目录一&#xff1a; Nginx三个重要的使用场景二&#xff1a; Nginx的优点三&#xff1a;Nginx文件的组成部分四&#xff1a;编译Nginx一&#xff1a; Nginx三个重要的使用场景 静态资源服务 疑问&#xff1a;为什么需要静态资源服务&#xff1f;答&#xff1a; 在整个的web请求…

string_string数据类型概括

目录string数据类型创建字符串的三种方式检查字符串的方法常用的字符串方法字符串遍历切割字符串为数组​截取子串判断某个字符串是否出现在当前字符串中文本匹配-match、(es6)matchAll文本替换-replace、(es6)replaceAll(es6)获取某个位置的字符串有关ASCII码的方法获取某字符…

Good Bye 2022: 2023 is NEAR C Koxia and Number Theory

Problem - C - Codeforces 题意&#xff1a; 给定一个数列a&#xff0c;问你是否存在一个数 x 使得所有数加上x之后两两互质 思路&#xff1a; 一、 我们知道一个结论&#xff0c;一些数两两之间互质&#xff0c;就说明所有数之间的质因子都不重合 如果要我们去判断一堆数…

回顾与展望Zebec举办的“Web3.0 TechHive Summit 2022 大会”

随着流支付生态 Zebec 不断的实现商业进展&#xff0c;我们看到&#xff0c;其生态从Solana陆续的迁移到以BNB Chain为代表的EVM链上&#xff0c;并推出了以ZK-Rollup为主要技术手段的公链Zebec Chain&#xff0c;以在未来服务且满足于Web2、Web3世界的发展需求。 Zebec正在成…

若依框架:前端项目结构与初始页面渲染流程

目录 main.js入口文件 前端页面初始化 package.json配置文件 vue-cli&#xff1a;.env模式和环境变量配置 vue-cli三大核心构件 CLI 服务与npm scripts vue-cli-service命令与.env模式配置文件 .env模式和环境变量配置 vue.config.js&#xff1a;项目启动-自动打开默认…

pycharm如何设置python文件模板

pycharm如何设置python文件模板设置文件模板预定义变量设置自定义模板变量设置文件模板 打开设置界面 进入编辑器->文件和代码模板 此处我只写了文件头注释模板&#xff0c;也可以加一些默认代码&#xff0c;比如&#xff1a; python if __name__ "__main__":…

NC65在单据添加按钮跳转到固定单据,且进行数据初始化

实现功能 下面两个是按钮 下面红框里面的内容是上面单据带过来的 上面就是本地代码实现的功能 具体实现代码 提前约定 为了方便称呼&#xff0c;这里把第一张图称为上游单据&#xff0c;第二张图为下游单据 所有代码AggVo都要替换成你自己的 配置文件 上游单据拓展配置文…

2023年天津美术学院专升本专业课线上考试安排准备及设备操作说明

天津美术学院2023年高职升本招生专业考试考生须知及操作说明一、考试时间安排二、考前准备 (一)纸张及其他材料(二)考试设备及网络 1.考生须提前准备好至少两部智能手机&#xff0c;为确保网络考试顺利进行&#xff0c;建议考生使用最近3年上市的主流品牌手机&#xff08;如iPh…

太强了!这么设计中间件完美解决了百万并发的问题!

V-xin&#xff1a;ruyuan0330 获得600页原创精品文章汇总PDF 目录 一、大部分人对Java并发仍停留在理论阶段二、中间件系统的内核机制&#xff1a;双缓冲机制三、百万并发的技术挑战四、内存数据写入的锁机制以及串行化问题五、片机制 分段加锁机制 六、缓冲区写满时的双缓冲…