树与图的深度优先遍历

数和图的存储方式与遍历

数和图的存储方式:

一般有两种
树是一种特殊的图(即无环联通图)。所以下面只讲图。

图的话分为两种:①有向图(边是有方向的:a➡️b)和
②无向图(边是无方向的:a——b)。这里无向图可以定义:a➡️b和b⬅️a来表达无向图
无向图可以看成特殊的有向图,所以接下来分析有向图

有向图,存储有两大类{
    ①:邻接矩阵,开个二维数组g[a][b]表示a➡️b,如果有权重,则g[a][b]表示权值。
邻接矩阵不能保存重复的边,若有的重边话只能保留一条,适合于最短路,空间复杂度为n^2。
    ②:邻接表——单链表。每个点上都有一个单链表,若有n个点就开n个单链表,每一个节点上开一个表。
每一个点存一个路径,就是存这个点能走到哪一个点。这里的路径无关顺序,也就是说除了根节点其余的都是子节点。插入方法和链表的插入方法一致
}

数和图的遍历:

有两种:①深度优先遍历,②宽度优先遍历
①:选取一个起点,从这个起点开始,向下DFS
②:BFS

题目:846. 树的重心 - AcWing题库

 思路:

 本题是无向边,所以要建两条边互相指向。
"重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。"
题目这句话的意思是:将某一个点删除之后,然后将剩下的每一块区域中含有多少
节点给统计出来,取一个最大值。循环操作,记录每一个节点删除后,所剩下区域的最大值都给记录出来然后在所有最大值里面取一个最小值,这个最小值就是题目所要求解。

图示:

代码: 

~~暴力无从下手~~

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;


int n;
const int N=1e5+10,M=N*2;
//h[u]即每一个点都可以作为头节点,向下遍历
int h[N],e[M],ne[M],idx;
//每个点只搜索一次
bool st[N];
//所有最大值中的最小值
int ans=N;

void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx,idx++;
}
//从u开始向下遍历。返回以u为根节点的子树中点的数量
int dfs(int u)
{
    //标记一下,当前这个点已经被搜过了
    st[u]=true;
    
    //sum为以此节点作为根节点区域的所有节点的数量,res表示删去这个节点后 所有连通块中的最大值
    int sum=1,res=0;
    
    //遍历一下u的所有可能移动的边,i每一次向下移动一个即等于当前点的下一个指向
//是从头开始遍历的,所以不需要恢复操作
    for(int i=h[u]; i!=-1 ;i=ne[i])
    {
        //当前这个点对应图中节点的编号是多少
        int j=e[i];
        //这个点只使用一次,不需要回溯也就不需要恢复st[j]的bool值
        if(!st[j]) 
        {
            int s=dfs(j);
            //取这个区域和上个区域连通块节点数量的最大值
            res=max(s,res);
            //计算以此节点作为根节点区域的所有节点的数量
            sum+=s;
        }
    }
    //不是以这个点作为根节点之外的区域的所有节点数量(n-sum),与根节点区域里的节点数量(res)取最大值
    res=max(res,n-sum);
    
    //和所有的最大值取一个最小值
    ans=min(res,ans);
    //返回一块区域的节点数量
    return sum;
}


int main()
{
    //每个点都可以作为根节点,所以初始化为-1
    memset(h,-1,sizeof h);
    
    cin >> n;
    
    for(int i=0;i<n;i++)
    {
        int a,b;
        cin >> a >> b;
        //因为是无向边,所以可以认为是互相指向
        add(a,b),add(b,a);
    }
//从哪一个节点深搜都是可以的,因为ans总能更新成最大值里的最小值
    dfs(1);
    
    cout << ans;
    return 0;
}

 tips:

这里的dfs中不需要恢复st[ j ]的原因是这里只需要遍历一遍所有的节点,然后求出以u作为根节点的数量即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安全设计 | Microsoft 威胁建模工具Threat Modeling Tool安装、使用及威胁生成原理详解(文末附样例)

1. 概览 微软威胁建模工具&#xff08;Threat Modeling Tool&#xff09;是 Microsoft 安全开发生命周期 (SDL&#xff0c;Security Development LifeCycle) 的核心要素。 当潜在安全问题处于无需花费过多成本即可相对容易解决的阶段&#xff0c;软件架构师可以使用威胁建模工…

断开自定义模块与自定义库的链接

断开自定义模块与自定义库的链接 1、断开模块与库的链接 1、断开模块与库的链接 如果摸个库文件添加到模型中&#xff0c;无法“Disable Link”时&#xff0c;可以使用save_system命令进行断开到模型中用户定义的库模块的链接&#xff1b; 参考链接&#xff1a; 传送门 save…

Python词法和语法分析工具库之ply使用详解

概要 在编程语言的开发、编译器的实现和数据解析等领域,词法分析和语法分析是关键的技术。Python的ply库是一个功能强大的词法和语法分析工具,基于经典的Lex和Yacc工具实现。ply库为开发者提供了一种简单且高效的方法,用于定义词法规则和语法规则,从而实现对自定义语言和数…

现货白银交易点差是多少

现货白银投资者通过交易平台进行买卖操作的时候&#xff0c;平台会以“点差”的形式向投资者收取一定的交易费用。所谓的点差&#xff0c;也就是平台所报出的买入价和卖出价之间的固定差额&#xff0c;由于现货白银的报价是“成对”的&#xff0c;所以点差的存在也是其交易模式…

【SpringMVC】_SpringMVC项目返回HTML与JSON

目录 1. SpringMVC项目返回HTML页面 2. SpringMVC项目返回JSON 2.1 程序演示 2.2 关于响应的Content-Type 2.2.1 接口为对象 2.2.2 接口为String 2.2.3 接口为Map 本专栏已介绍&#xff1a; 返回静态页面&#xff1a; 【Spring MVC】_SpringMVC项目返回静态页面_mvc 返…

2024了,还有人在问为甚死锁?

大家好&#xff0c;我是javapub。 接上篇提到了锁&#xff0c;《InnoDB有哪些锁类型》。这么多的锁&#xff0c;你有遇到过死锁吗&#xff1f; 死锁是在事务数据库中会发生的一种特殊现象&#xff0c;多个事务在执行过程中&#xff0c;相互等待对方持有的资源&#xff0c;导致…

软件游戏缺失d3dcompiler_47.dll如何解决,简单有效的五种解决方法分享

在现代游戏中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“缺少d3dcompiler47.dll文件”。这个问题通常会导致游戏无法正常运行或出现崩溃的情况。为了解决这个问题&#xff0c;我总结出了以下五种解决方法。希望这些方法能够帮助到遇到相同问题的玩家。 …

论文解读之A General-Purpose Self-Supervised Model for Computational Pathology

一、前言 目前&#xff0c;有很多无知者认为计算机在疾病诊断上超过了人类&#xff0c;他们的理解是计算机在美丽国的某个什么医师测评上得分超过了人类。这比较可笑和无知。 笔者认为&#xff1a;病理图像的病症复杂、种类繁多&#xff0c;同时数据集很少并且标注极为困难。…

学习笔记——动态路由协议——OSPF(简介)

一、 OSPF简介 1、前言 由于静态路由由网络管理员手工配置&#xff0c;因此当网络发生变化时&#xff0c;静态路由需要手动调整&#xff0c;这制约了静态路由在现网大规模的应用。 动态路由协议因其灵活性高、可靠性好、易于扩展等特点被广泛应用于现网。在动态路由协议之中…

数字工厂管理系统可以和哪些软件集成

随着工业4.0时代的到来&#xff0c;数字工厂管理系统已成为制造业转型升级的核心驱动力。数字工厂管理系统通过集成各种软件和技术&#xff0c;实现了生产过程的数字化、网络化和智能化&#xff0c;大大提高了生产效率和管理水平。本文将探讨数字工厂管理系统可以与哪些软件集成…

在table表格中如何给tr的每一个子元素加haver效果

效果图&#xff1a; 核心代码&#xff1a; tbody tr :hover {background-color: #d5d5d5; } 改变子元素 tbody tr:hover {background-color: #d5d5d5; } 改变父元素 两段代码看起来一样&#xff0c;其实不一样&#xff0c;其中差了一个空格字符 希望可以帮到大家

Xilinx FPGA中的BUFFER

FPGA大型设计中推荐使用同步时序电路&#xff0c;同步时序电路基于时钟触发沿设计&#xff0c;对时钟的周期、占空比、延时和抖动有更高的要求。为满足时序的要求&#xff0c;一般采用全局时钟资源驱动设计的主时钟&#xff0c;FPGA的主时钟一般使用全铜层工艺实现&#xff0c;…

服务器内存与CPU要占用多少才合理?

一 通常服务器内存占用多少合理&#xff1f;cpu占用多少才合理&#xff1f; 1 通常配置范围建议&#xff1a; 建议CPU使用率不高于80%&#xff1b;内存使用率不高于80%&#xff1b; 注意&#xff1a;具体情况还需要根据服务器的实际负载和应用场景来判断。 2 内存使用率&…

揭秘智慧校园:可视化技术引领教育新篇章

随着科技的飞速发展&#xff0c;我们的生活方式正在经历一场前所未有的变革。而在这场变革中&#xff0c;学校作为培养未来人才的重要基地&#xff0c;也在不断地探索与创新。 一、什么是校园可视化&#xff1f; 校园可视化&#xff0c;就是通过先进的信息技术&#xff0c;将学…

光纤现网与接入网概念对应

OLT 一般在机房 一级分光可能在机房也可能在光交交接箱 路边的光交交接箱功能有分光或者光纤汇聚转换一下 二级分光在分光光纤箱里&#xff0c;楼道里面挂着的那种 ONU是家里的光猫

喜讯 | 盘古信息冠捷科技、锐明科技IMS项目荣获创新案例、优秀案例

5月28日&#xff0c;中国数据要素及行业应用创新大会盛大启幕&#xff0c;现场汇聚了中国工程院院士、数据要素研究机构及数据要素知名企业、数字要素行业生态代表等300位业内相关人士。广东盘古信息科技股份有限公司副总经理朱熀锋代表盘古信息出席大会&#xff0c;并带来了IM…

【SOFARPC框架的设计和实现】笔记记录

感谢刘老师对rpc框架的视频讲解&#xff1a;SOFAChannel#31 RPC框架的设计和实现_哔哩哔哩_bilibili 每个扩展点就是一个接口&#xff0c;可以通过实现接口来时拓展。 以registry举例&#xff0c;可以使用Extensible注解标记接口&#xff0c;然后Extension标记方法的实现。 …

STM32定时器及输出PWM完成呼吸灯

文章目录 一、STM32定时器原理1、基本定时器2、通用定时器&#xff08;1&#xff09;时钟源&#xff08;2&#xff09;预分频器PSC&#xff08;3&#xff09;计数器CNT&#xff08;4&#xff09;自动装载寄存器ARR 3、高级定时器 二、PWM工作原理三、控制LED以2s的频率周期性地…

esp8266的rtos和nonos区别

https://bbs.espressif.com/viewtopic.php?t75242#p100294 https://blog.csdn.net/ydogg/article/details/72598752

MT3043 排序

思路&#xff1a; 如果有两次操作i和j&#xff0c;j在i后面操作&#xff0c;且j的x比i的x大&#xff0c;则i的操作被j所覆盖&#xff08;即i的操作是无用的&#xff09; 可以将操作i删除。 如果有两次操作i和j&#xff0c;j在i后面操作&#xff0c;且j的x比i的x小&#xff…