蓝桥杯上岸必背!!!(第六期树与图的遍历)

news2025/2/23 19:17:40

第六期:树与图的遍历 🔥 🔥 🔥

蓝桥杯热门考点模板总结来啦✨ ~

你绝绝绝绝绝绝对不能错过的常考树与图的遍历模板 💥

❗️ ❗️ ❗️

大家好 我是寸铁 💪

祝大家4月8号蓝桥杯上岸 ☀️

还没背熟模板的伙伴们背起来 💪 💪 💪

祝大家4月8号蓝桥杯上岸 ☀️

不清楚蓝桥杯考什么的点点下方👇

考点秘籍

想背纯享模版的伙伴们点点下方👇

蓝桥杯省一你一定不能错过的模板大全(第一期)

蓝桥杯省一你一定不能错过的模板大全(第二期)

想背注释模版的伙伴们点点下方👇

蓝桥杯必背第一期

蓝桥杯必背第二期

往期精彩回顾

蓝桥杯上岸每日N题 第一期(一)!!!

蓝桥杯上岸每日N题第一期(二)!!!

蓝桥杯上岸每日N题第一期(三)!!!

蓝桥杯上岸每日N题第二期(一)!!!

蓝桥杯上岸每日N题第三期(一)!!!

操作系统期末题库 第九期(完结)

LeetCode Hot100 刷题(第三期)

idea创建SpringBoot项目报错解决方案

数据库SQL语句(期末冲刺)

想看JavaB组填空题的伙伴们点点下方 👇

填空题

竞赛干货

算法竞赛字符串常用操作大全

蓝桥杯上岸必刷!!!(模拟/枚举专题)

蓝桥杯上岸必背!!! (第三期 DP)

蓝桥杯上岸必背!!!(第四期DFS)

蓝桥杯上岸必背!!!(第五期BFS)

树与图的遍历与DFS/BFS是蓝桥杯的热门考点,距离省赛仅剩4天,干就完事了 ❗️

下面让我们开始刷起来 ❗️ ❗️ ❗️

DFS你的大脑,BFS你的体力 💪 💪 💪

让我们一起上岸蓝桥杯 ✌️

树与图的深度优先遍历🌲

树的重心

邻接表

邻接表(Adjacency List)顾名思义,就是通过链表或者利用数组模拟链表的方式将图的相连接关系表示的一种方法,存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。 如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。

分析

重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。
树的重心:运用DFS+邻接表
DFS:递归处理根节点的子树的节点个数
邻接表:找到节点的邻接点,继续递归,走到叶子节点时,再往上返回,直至回到根节点,再以当前根节点的邻接点作为根节点,再DFS,确保每一个点都会走到。

问题分析:

根据重心的定义:
(1)如果将这个点删除后,剩余各个连通块中点数的最大值。
我们需要遍历各个根节点,将根节点的最大子树保存下来。
(2)剩余各个连通块中点数的最大值最小。
再将各个根节点的最大子树进行比较,得出最小值,即是重心,即为答案。

模拟

u=1作为根节点,一条路走到黑,走到叶子节点,最后返回到根节点1
在这里插入图片描述

由于从1开始,无法体现下面与上面部分的比较
走完u=1,接下来走到u=2,以u=2为根节点。在这里插入图片描述

注:可以看到从根节点出发,递归其根节点的邻接节点,邻接节点继续递归他的邻接节点,他的邻接节点继续递归他的邻接节点,直至往下走到叶子节点,即往下再无路可走时,往上返回,直至回到根节点。
在这过程中,记录根节点的邻接节点的最大子树。再将一路走过的点进行求和,便于求解根节点的上面连通块部分。再以根节点的邻接点为根节点出发,继续往下dfs,如此循环往复,走便所有的点为止。

代码

import java.util.*;
public class Main{
    static int N=100010,M=N*2,idx,n;//输入的数是点数的两倍
    static int h[]=new int[N];
    
    static int e[]=new int[M];//最多有2倍
    static int ne[]=new int[M];//最多有2倍
    static boolean st[]=new boolean[N];//标记哪个点已走过
    static int ans=N;//先定义一个比较大的数,用于比较最小值。
    public static void add(int a,int b){//单链表存边
        e[idx]=b;//存值
        ne[idx]=h[a];
        h[a]=idx;//存边,h[a]表示的是边的编号,也是对应插入点的编号。
        idx++;
    }
    public static int dfs(int u){
        int sum=1;//本身算作一个点,用于求某个连通块的节点总数
        int res=0;//结果
        st[u]=true;//表示该节点走过,保证往下搜,防止再向上查找一遍,造成死循环。
        for(int i=h[u];i!=-1;i=ne[i]){//遍历邻接表的边
        int j = e[i];//找到节点的邻接节点。
        if(!st[j]){//如果没有走过,就dfs该节点,继续递归下去,直至走到叶子节点。
            int s = dfs(j);//让该邻接节点作为根节点,dfs该节点,统计他子树的子节点个数。
            res=Math.max(res,s);//保留的是该节点的最大子树
            sum+=s;//将该节点的各子树的节点数都加起来,便于求上面连通块的节点数。
        }
        }
        res=Math.max(res,n-sum);//比较上面连通块和下面连通块的节点数,看哪个部分比较大
        ans=Math.min(res,ans);//保存各根节点的最大子树的最小值,即删除重心,也就是答案
        return sum;//返回sum,递归处理走到的点。
    }
    public static void main(String []args){
        Scanner in = new Scanner(System.in);
         n = in.nextInt();                          
        for(int i=1;i<N;i++){
            h[i]=-1;初始化,链表开始是均指向-1
        }
        for(int i=0;i<n-1;i++){
        int a= in.nextInt();
        int b =in.nextInt();
        //无向边
        add(a,b);//a-->b
        add(b,a);//b-->a
        }
        dfs(1);
        //从1开始dfs,理论上任意一个点都可以,保险起见,防止输入的点只有一个1的情况
        System.out.println(ans);
}
}

树与图的广度优先遍历🌲

图中点的层次

分析

题目描述

在这里插入图片描述

这里的重边和自环其实可以不用太纠结,无论是重边还是自环,只要确保两个点之间有连边,便可以进行bfs搜索,继而找到1 -> n的最短距离。
这道题是求最短距离,像最短步数最少操作权重为1的问题均可以用Bfs+邻接表的方式来处理。

做法

**邻接表:**存边,便于bfs搜索邻接节点。
**BFS:**一层一层往外搜,搜到一个就入队一个,再依次出队去搜索队头的邻接节点,直到搜到第n号点。如第一层搜到的为距离为1的点,第二层搜到的为距离为2的点,依次类推。
通过一层一层的bfs搜索,搜到当前节点的邻接节点,将该邻接节点入队,距离值更新为前面入队的点的距离加上1,然后邻接节点出队,又继续去搜它的邻接节点,继续一层一层往下搜,直到搜到n号点。

模拟

在这里插入图片描述
注:先从根节点开始,找到根节点的邻接节点,入队,记得更新距离。出队,再继续寻找邻接节点的邻接节点,又入队,同时,不忘更新距离。一层一层往下搜,直至第n个点。

题目模拟

在这里插入图片描述

注:
根节点从1开始,此时距离为0。然后,可以找到1的两个邻接节点,分别为2、4。并让2、4入队,更新到这两个点的距离为2。应题目要求,这里已经找到d[4],所以直接返回答案即可。那再把队头2弹出,可以找到2的邻接节点3,更新距离为2。将3入队,此时队列还剩3、4,队头为4,再将4出队,4的邻接节点也是3,但是3已经走过,所以就不会再走。最后,队列还剩3,出队,3无邻接节点,无路可走,循环结束。

邻接表模拟

在这里插入图片描述

注: 从图中可以看出新插入的节点对应建好的边的编号,通过遍历边实现遍历点。

代码

//进队、出队-->每一层能搜到的距离都是相同的
import java.util.*;
public class Main{
    static int N=100010,idx,n,m,hh,tt;
    static int q[]=new int [N];
    static int ne[]=new int[N];
    static int e[]=new int [N];
    static int d[]=new int[N];
    static int h[]=new int[N];
    public static void add(int a,int b){//邻接表
        e[idx]=b;
        ne[idx]=h[a];
        h[a]=idx;
        idx++;
    }
    public static int bfs(){
        hh=0;
        tt=0;
        q[0]=1;//队列的队头最初为1
        for(int i=1;i<d.length;i++){
            d[i]=-1;//将每个点的初始值赋为-1,表示这个点没走过。
        }
        d[1]=0;//将1赋为0,表示这个点走过。
       
        while(hh<=tt){
             int t=q[hh++];//队头元素出队
            for(int i=h[t];i!=-1;i=ne[i]){
                int j=e[i];//找到邻节点(邻边)
                if(d[j]==-1){//这个点还没走过
                d[j]=d[t]+1;//记录前一个邻接点走过的距离+当前这个点本身
                q[++tt]=j;//满足条件的入队
            }
        }
    }
    return d[n];//返回到n的距离
}
public static void main(String []args){
    Scanner in = new Scanner(System.in);
    n=in.nextInt();
    m=in.nextInt();
    for(int i =1;i<N;i++)
    {
        h[i]=-1;//初始化,指向空
    }
    for(int i=0;i< m;i++){
        int a=in.nextInt();
        int b=in.nextInt();
        add(a,b);
    }
    System.out.println(bfs());
}
}

java容器类:Queue

import java.util.*;
public class Main{
    static int N=100010;
    static int e[]=new int[N];
    static int ne[]=new int[N];
    static int d[]=new int[N];
    static int q[]=new int[N];
    static int h[]=new int[N];
    static int idx,n,m,hh,tt;
    public static void add(int a,int b){
        e[idx]=b;
        ne[idx]=h[a];
        h[a]=idx;
        idx++;   
        
    }
    public static int bfs(){
        Queue<Integer>q=new LinkedList<Integer>();
        q.add(1);
        d[1]=0;
        while(!q.isEmpty()){
            int t=q.poll();
        for(int i=h[t];i!=-1;i=ne[i]){
            int j=e[i];
            if(d[j]==-1){
                d[j]=d[t]+1;
                q.add(j);
            }
        }
    }
    return d[n];
    }
    public static void main(String []args){
        Scanner sc=new Scanner(System.in);
         n=sc.nextInt();
         m=sc.nextInt();
        Arrays.fill(h,-1);
        Arrays.fill(d,-1);
        for(int i=0;i<m;i++){
            int a=sc.nextInt();
            int b=sc.nextInt();
            add(a,b);
        }
        System.out.println(bfs());
    }
}

✨ ✨ ✨
看到这里,不妨点个关注 💖

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

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

相关文章

2.1数据结构——线性表

一、定义 线性表是具有相同数据类型的n&#xff08;n>0&#xff09;个数据元素的有限序列&#xff0c;&#xff08;n表示表长&#xff0c;n0为空表&#xff09; 用L表示&#xff1a; 位序&#xff1a;线性表中的“第i个” a1是表头元素&#xff1b;an是表尾元素 除第一个…

2023 年牛客多校第三场题解

A World Fragments I 题意&#xff1a;给定两个二进制数 x , y x,y x,y&#xff0c;每次可以选择 x x x 二进制表达中的其中一位 b b b&#xff0c;然后执行 x ← x − b x \leftarrow x-b x←x−b 或 x ← x b x \leftarrow xb x←xb。问 x x x 最少经过多少次操作变成…

高速数据采集专家-FMC140【产品手册】

FMC140是一款具有缓冲模拟输入的低功耗、12位、双通道&#xff08;5.2GSPS/通道&#xff09;、单通道10.4GSPS、射频采样ADC模块&#xff0c;该板卡为FMC标准&#xff0c;符合VITA57.1规范&#xff0c;该模块可以作为一个理想的IO单元耦合至FPGA前端&#xff0c;8通道的JESD204…

第一启富金:现货黄金市场等待央行决议 非美商品‘弱不禁风’

第一启富金基本面分析&#xff1a; 中国纸黄金交易通显示&#xff0c;全球最大黄金上市交易基金(ETF)截至07月22日持仓量为919.00吨&#xff0c;较上日增持5.20吨&#xff0c;本月止净减持2.90吨。 在俄罗斯上周退出黑海谷物协议&#xff0c;摧毁了乌克兰通往基辅的一条出口路线…

PKCS#1: RSA加密时摘要值规范

RSA的加密和签名标准是类似的&#xff0c;加密时的摘要值结构如下 即非普通的hash摘要值&#xff0c;而是der编码结构的hash摘要值&#xff0c;用ASN1工具打开 可以快速的组装成一个der编码结构的摘要值&#xff0c;代码如下 ByteArrayOutputStream digestInfoValueBuf new By…

《向量数据库指南》:向量数据库Pinecone如何集成OpenAI

目录 嵌入式介绍 环境设置 创建嵌入 初始化Pinecone索引 填充索引 ⚠️警告 查询 本指南介绍了将OpenAI的大型语言模型(LLMs)与Pinecone(称为 OP stack )集成的方法,增强LLMs的语义搜索或“长期记忆”。此组合利用LLMs的嵌入和完成(或生成)端点,以及Pinecone的向…

MySQL 数据库约束

目录 一、数据库约束 1、约束类型 二、NULL 约束 三、unique 约束 四、default 约束 五、primary key 约束 自增主键 六、foreign key 外键约束 七、check 约束 一、数据库约束 我们使用数据库来存储数据&#xff0c;一般是希望这里存储的数据是靠谱的&#xff0c;…

追觅科技,拿什么撑起「百亿」野心?

作者 | 刘然 来源 | 洞见新研社 极度内卷的扫地机人赛道迎来了分叉路口。 从头部企业的最新动向&#xff0c;我们可以一览行业变化。 科沃斯选择多元化发展&#xff0c;大力拓展家电品类&#xff0c;推出了智能料理机、空气净化仪等产品&#xff1b;石头科技坚守爆品战略的同…

超详细,自动化测试allure测试报告实战(总结)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 allure可以输出非…

【Kubernetes运维篇】ingress-nginx实现业务灰度发布详解

文章目录 一、理论&#xff1a;实现灰度发布的几种场景1、场景一&#xff1a;将新版本灰度给部分用户2、场景二&#xff1a;按照比例流程给新版本3、实现灰度发布字段解释 二、实践&#xff1a;1、实验前提环境2、基于Request Header(请求头)进行流量分割3、基于Cookie进行流量…

FAPI15 探针,作为代谢剂进行PETCT检测,反应机理说明

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ PART1----FAPI-15试剂 英文名称&#xff1a;FAPI-15 CAS号&#xff1a;N/A 分子式&#xff1a;N/A 分子量&#xff1a;N/A 规格标准&#xff1a;1g&#xff0c;5g&#xff0c;10g&#xff0c;可提供mg级以及kg级的产品开发…

docker容器引擎(四)

docker 一、docker compose的理论二、docker-compose工具实验创建apache容器创建LNMP 一、docker compose的理论 docker compose简而言之就是实现单机容器集群编排管理&#xff08;使用一个模板文件定义多个应用容器的启动参数和依赖关系&#xff0c;并使用docker compose来根…

专项练习-04编程语言-03JAVA-03

1. java 中哪个关键字可以对对象加互斥锁&#xff1f;A transient B synchronized C serialize D static 正确答案&#xff1a;B 官方解析&#xff1a;暂无官方题目解析&#xff0c;去讨论区看看吧&#xff01; 知识点&#xff1a;Java、Java工程师、20172. 关于异常处理机制的…

93.qt qml-自定义Table优化(新增:水平拖拽/缩放自适应/选择使能/自定义委托)

之前我们更新了90.qt qml-Table表格组件(支持表头表尾固定/自定义颜色/自定义操作按钮/排序)_qml 表格_诺谦的博客-CSDN博客 但是一直没出源码,是因为该demo还存在问题,那就是表头表尾固定下,如果是半透明状态下,会看到表头表尾固定后的内容,所以只能重构代码,不能使用重…

关于阅读《重构的时机和方法》这本书所带来的启发

前言 近期&#xff0c;我阅读了由克里斯蒂安克劳森&#xff08;Christian Clausen&#xff09;写的、由郭涛翻译的《重构的时机和方法》这本书&#xff0c;读完这本书的内容你会发现《重构的时机和方法》是一本经典的软件开发书籍&#xff0c;它能够帮助软件开发人员提高代码质…

Java_22_多线程02

多线程 线程通信 线程通信&#xff1a;多个线程因为在同一个进程中&#xff0c;所以互相通信比较容易的。 线程通信的经典模型&#xff1a;生产者与消费者问题。 生产者负责生成商品&#xff0c;消费者负责消费商品。 生产不能过剩&#xff0c;消费不能没有。&#xff08;即时…

创建一个vite项目,一个命令创建

1. 在一个文件夹下打开cmd命令窗口并输入命令&#xff1a; npm init vuelatest //注意&#xff0c;此命令安装的是vue最新的依赖包&#xff0c;步骤也许跟以下有点点区别&#xff0c;不过问题不大 2. 接着询问你是否需要安装以下这些包&#xff0c;这些都是需要的&#xff0c…

华为OD机试真题 Java 实现【最多获得的短信条数】【2023Q1 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多&…

Pytorch深度学习------torchvision中dataset数据集的使用(CIFAR10)

文章目录 一、什么是TorchVision二、以torchvision.datasets子模块下的CIFAR10数据集为例1、CIFAR10数据集参数2、代码中使用 一、什么是TorchVision torchvision是pytorch的一个图形库&#xff0c;用来处理图像&#xff0c;主要用来构建计算机视觉模型。 从下面的官网截图可以…

力扣1114.按序打印-----题目解析

题目描述 解析&#xff1a; class Foo {public int a 0;public Foo() {}public void first(Runnable printFirst) throws InterruptedException {// printFirst.run() outputs "first". Do not change or remove this line.printFirst.run();a;}public void second…