当前位置: 首页 > news >正文

树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次

一、AcWing 846. 树的重心

1.1题目

1.2思路分析

题意:什么是树的重心?

树的重心是指,删除某个结点后剩下的最大连通子树的结点数目最小,如下图是根据样列生成的树,若删除结点1,则剩下三个子树最大的是中间那颗结点有4个,即剩下的最大连通子树的结点数目为4;若删除结点2,则剩下两个数目为1的子树和一个数目为6的子树,即剩下的最大连通子树的结点数目为6;若删除结点3,剩下一个数目为1的子树,和一个数目为7的子树,即剩下的最大连通子树的结点数目为7……枚举可得剩下的最小的最大连通子树的结点数目为4也就是说结点1是树的重心。另外注意题目要求答案是输出剩下的最小的最大连通子树的结点数目。

思路

深搜,算出每个结点被删除后剩下的最大连通子树的结点数目,输出最小值即可,那么问题就是怎么求一个结点被删除后的最大连通子树的结点数目,删除一个结点后,剩下的子树可以被分为两个部分,例如删除结点4:

蓝色部分是结点4的子树,红色部分我们暂时称为其他部门,因为我们知道树的总结点数n,只要能算出蓝色部分的数目s,那么其他部分的数目就是n-s。

1.3Ac代码


import java.io.*;
import java.util.Arrays;public class Main {static int N = 100010;static int M=2*N; //n-1条无向边需要两倍空间来存储static int[] h = new int[N]; //邻接表存储树,有n个节点,所以需要n个队列头节点static boolean[] st = new boolean[N]; //记录节点是否被访问过,访问过则标记为truestatic int[] e = new int[M]; //存储元素static int[] ne = new int[M]; //存储列表的next值static int n, idx; //题目所给的输入,n个节点以及单链表指针static int ans=N;   //表示重心的所有的子树中,最大的子树的结点数目public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));n=Integer.parseInt(br.readLine());Arrays.fill(h,1,n+1,-1);    //结点从1开始,开始时边为空,即h数组值为-1表示无出边for (int i = 0; i < n-1; i++) {String []s=br.readLine().split(" ");int a=Integer.parseInt(s[0]);int b=Integer.parseInt(s[1]);add(a,b);   add(b,a);}dfs(1);System.out.println(ans);}private static int  dfs(int u) {st[u]=true;int sum=1;  //当前子树大小,包括自己故从1开始int res=0;  //删除该结点后每一个连通块大小的最大值for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(!st[j]){int s=dfs(j);    //其儿子子树的大小res=Math.max(res,s); //找出儿子子树中的最大值sum+=s;}}res=Math.max(res,n-sum);//每个结点dfs最终得出的这个res即为以该结点为重心,删除后各个连通块中点数的最大值ans=Math.min(res,ans);return sum;}private static void add(int a, int b) {e[idx]=b;ne[idx]=h[a];h[a]=idx++;}
}

二、AcWing 847. 图中点的层次

2.1题目

2.2思路分析

用 d数组保存1号节点到各个节点的距离。

用 st 数组标记各个节点有没有走到过。

从 1 号节点开始,广度优先遍历:

1 号节点入队列,d[1] 的值更新为 0。

如果队列非空,就取出队头,找到队头节点能到的所有节点。如果队头节点能到走到的节点没有标记过,就将节点的d值更新为队头的d值+1,然后入队。

重复步骤 2 直到队列为空。

这个时候,d数组中就存储了 1 号节点到各个节点的距离了。

图的存储:邻接表

用 h 数组保存各个节点能到的第一个节点的编号。开始时,h[i] 全部为 -1。

用 e 数组保存节点编号,ne 数组保存 e 数组对应位置的下一个节点所在的索引。

用 idx 保存下一个 e 数组中,可以放入节点位置的索引

插入边使用的头插法,例如插入:a->b。首先把b节点存入e数组,e[idx] = b。然后 b 节点的后继是h[a],ne[idx] = h[a]。最后,a 的后继更新为 b 节点的编号,h[a] = idx,索引指向下一个可以存储节点的位置,idx ++ 。

2.3Ac代码


import java.io.*;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Map;
import java.util.Queue;public class Main {static int N = 100010;static int[] h = new int[N]; //邻接表存储树,有n个节点,所以需要n个队列头节点static boolean[] st = new boolean[N]; //记录节点是否被访问过,访问过则标记为truestatic int[] d = new int[N]; //存储距离static int[] e = new int[N]; //存储元素static int[] ne = new int[N]; //存储列表的next值static int n,m, idx; //题目所给的输入,n个节点以及单链表指针public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String []s=br.readLine().split(" ");n=Integer.parseInt(s[0]);    m=Integer.parseInt(s[1]);Arrays.fill(h,-1);for (int i = 0; i < m; i++) {s=br.readLine().split(" ");int a=Integer.parseInt(s[0]);int b=Integer.parseInt(s[1]);add(a,b);}bfs();System.out.println(d[n]);}private static void bfs() {Queue<Integer> q=new ArrayDeque<>();Arrays.fill(d,-1);q.add(1);d[1]=0;st[1]=true;while (!q.isEmpty()){int he=q.poll();for(int i=h[he] ;i!=-1;i=ne[i]){int t=e[i];if(!st[t]){d[t]=d[he]+1;q.add(t);st[t]=true;}}}}private static void add(int a, int b) {e[idx] = b;ne[idx] = h[a];h[a] = idx++;}}

相关文章:

树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次

一、AcWing 846. 树的重心1.1题目1.2思路分析题意&#xff1a;什么是树的重心&#xff1f;树的重心是指&#xff0c;删除某个结点后剩下的最大连通子树的结点数目最小&#xff0c;如下图是根据样列生成的树&#xff0c;若删除结点1&#xff0c;则剩下三个子树最大的是中间那颗结…...

从零开始学数据分析之数据分析概述

当今世界对信息技术的依赖程度在不断加深&#xff0c;每天都会有大量的数据产生&#xff0c;我们经常会感到数据越来越多&#xff0c;但是要从中发现有价值的信息却越来越难。 这里所说的信息&#xff0c;可以理解为对数据集处理之后的结果&#xff0c;是从数据集中提炼出的可…...

十五载厚积薄发,电信级分布式数据库是这样炼成

所在论坛&#xff1a;数据库技术创新&云原生论坛 分享时段&#xff1a;2.18 10:00-10:30 分享主题&#xff1a;大规模并行处理&#xff1a;AntDB分布式演进之路 分享嘉宾&#xff1a;沈夺&#xff0c;亚信科技AntDB数据库内核开发工程师 由中国开源软件推进联盟Postgre…...

Centos调整分区存储大小

将/home下900G转移到/目录下 1、查看分区大小&#xff1a;df -hl 2、备份home文件&#xff1a;tar cvf /run/home.tar /home 3、终止home文件进程&#xff08;切换到非home路径下执行这个命令&#xff09;&#xff1a;fuser -km /home 3.1、如果没有fuser&#xff0c;在线安装…...

华为OD机试真题JAVA实现【单词接龙】真题+解题思路+代码(20222023)

华为OD机试真题JAVA实现【单词接龙】真题+解题思路+代码(2022&2023) 🔥系列专栏 华为OD机试(JAVA)真题目录汇总华为OD机试(Python)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出示例一输入输…...

Mapbox Style 规范

Mapbox致力于打造全球最漂亮的个性化地图。 中文官网经常打不开所以做下记录&#xff0c;方便查阅。 Web 端 API Mapbox GL JS 的地图样式规范 Style 的各个配置项&#xff1a; &#xff08;必填项会加上 * &#xff0c;方便根据目录进行查看&#xff09; 配置项&#xff1a;1.…...

Java开发学习(五十)----MyBatisPlus快速开发之代码生成器解析

1、代码生成器原理分析 造句: 我们可以往空白内容进行填词造句&#xff0c;比如: 在比如: 观察我们之前写的代码&#xff0c;会发现其中也会有很多重复内容&#xff0c;比如: 那我们就想&#xff0c;如果我想做一个Book模块的开发&#xff0c;是不是只需要将红色部分的内容全部…...

HTML学习

文章目录基础知识什么是HTMLW3C标准在IDEA中创建一个html文件HTML的基本结构网页基本信息网页的基本标签图像标签链接标签文本链接图片链接图片格式锚链接功能性链接其他基本标签块元素和行内元素标签对照表列表HTML3种列表有序列表无序列表定义列表HTML学习中的误区表格标签基…...

Java最新学习路线

Java语言是目前流行的互联网等企业的开发语言&#xff0c;是市面上很多程序员喜欢并且在用的程序设计语言。关于学习java&#xff0c;有一部分人是为了就业或自己创业&#xff0c;而大多数人是希望使用java这个开发语言用来工作&#xff0c;开发出计算机后端系统&#xff0c;利…...

腾讯xSRC[linux+docker]搭建教程

腾讯xSRC[linuxdocker]搭建教程 1.下载镜像 docker pull xsrc/xsrc:v1.0.12.启动镜像 1️⃣启动镜像 docker run -it -d --name xsrc_web -p 60080:80 -p 63306:3306 --privilegedtrue xsrc/xsrc:v1.0.1注意将3306端口映射到8806端口&#xff0c;以便于远程连接访问容器内数…...

springcloud - 2021.0.3版本 - (一)服务注册nacos+feign

一&#xff0c;注册中心 最新版使用的是nacos&#xff0c;可替换为eureka&#xff0c;zookeeper&#xff0c;使用方式大同小异&#xff0c;这里不做扩展。 下载安装&#xff1a;&#xff08;有机会重装时再补上&#xff09; 管理页面&#xff1a;http://localhost:8848/naco…...

C++教程(初级,有基础)

C教程&#xff08;初级&#xff0c;有基础&#xff09; #include <iostream> using namespace std; int main() { /*对应printf("")*/cout << "Hello, world!" << endl;//cout << "Hello, world!" << "\n&q…...

字符编码及转换

什么是字符编码字符编码&#xff08;Character encoding&#xff09;也称字集码&#xff0c;是把字符集中的字符&#xff0c;编码为指定集合中的某一对象&#xff08;例如&#xff1a;比特模式、自然数序列、8位组或者电脉冲&#xff09;&#xff0c;以便文本在计算机中存储或者…...

redis原理

文章目录一、Redis数据结构1.1.动态字符串SDS1.2 intset1.3 Dict1.4 ZipList1.5 QuickList1.6 SkipList1.7 RedisObject二、Redis五大基本数据类型底层2.1.String2.2.List2.3.Set2.4.ZSet2.4.Hash三、Redis网络模型3.1.用户空间和内核空间3.2.阻塞IO3.3.非阻塞IO3.4.IO多路复用…...

kettle开发-Day37-SQ索引优化

前言&#xff1a;在上一个生产项目中&#xff0c;有个单表数据超249G了&#xff0c;里面存储的数据时间跨度就1年左右&#xff0c;那为啥会出现这种情况呢&#xff1f;数据来源为&#xff0c;一个生产基地所有电表的每分钟读数&#xff0c;一个基地大概500个电表左右&#xff0…...

【camera之3a】AE

文章目录sensorAEsensor 分辨率 常见分辨率的感性表述即30万、100万、200万&#xff0c;正确表述应为0.3M、1M、2M&#xff0c;其中M代表百万&#xff0c;是像素单位。sensor分辨率即指在单位面积上&#xff0c;像素的个数&#xff0c;数值越大 &#xff0c;则代表像素点越多&…...

Docker-Consul概述以及集群环境搭建

一、Docker consul概述容器服务更新与发现&#xff1a;先发现再更新&#xff0c;发现的是后端节点上容器的变化&#xff08;registrator&#xff09;&#xff0c;更新的是nginx配置文件&#xff08;agent&#xff09;egistrator&#xff1a;是consul安插在docker容器里的眼线&a…...

性能技术分享|Jmeter+InfluxDB+Grafana搭建性能平台(四)

四、Jmeter配置InfluxDB4.1 后端监听器(BackendListener)介绍1、什么是后端监听器(BackendListener)&#xff1f;源码给出的解释是&#xff1a;BackendListener是一种异步监听并获取到测试结果的实现类。也就是说发出的如http等响应请求的结果&#xff0c;都会被封装在SampleRe…...

图数据建模基础

Neo4j 图的组件 节点&#xff08;Nodes&#xff09;标签&#xff08;Labels&#xff09;关系&#xff08;Relationships&#xff09;属性&#xff08;Properties&#xff09;建模过程 了解领域并为应用程序定义特定用例&#xff08;问题&#xff09;。开发初始图形数据模型。 对…...

nodejs篇 process模块

目录 前言 监听回调 beforeExit 、exit、uncaughtException beforeExit exit uncaughtException Process常用属性 stdout stdin process方法 process.cwd()&#xff0c;process.chdir() process.nextTick() process.exit() process.kill() 前言 process是nodejs提…...

Llama-3.2V-11B-cot在智能教育中的应用:数学题配图逻辑漏洞识别实战

Llama-3.2V-11B-cot在智能教育中的应用&#xff1a;数学题配图逻辑漏洞识别实战 1. 引言&#xff1a;当AI遇见数学教育 数学教材和习题集中的配图错误是一个长期困扰教育行业的难题。据统计&#xff0c;约15%的数学教材配图存在不同程度的逻辑漏洞或表达偏差&#xff0c;这些…...

SAP资产会计数据迁移:除了AS91,你还需要检查这些关键配置(传输日期、抵销科目详解)

SAP资产会计数据迁移&#xff1a;AS91之外的7个关键配置陷阱与解决方案 当你在凌晨三点盯着屏幕上不平的资产折旧凭证时&#xff0c;AS91的简单操作指南显然已经不够用了。作为经历过数十个SAP上线项目的顾问&#xff0c;我发现90%的资产数据迁移问题都源于那些容易被忽略的后台…...

数据恢复全面指南:开源数据救援工具组合实战手册

数据恢复全面指南&#xff1a;开源数据救援工具组合实战手册 【免费下载链接】testdisk TestDisk & PhotoRec 项目地址: https://gitcode.com/gh_mirrors/te/testdisk 数据丢失的噩梦与解决方案 2023年&#xff0c;摄影师小李在一次外景拍摄后误格式化了SD卡&#…...

告别“人工智障”!OpenClaw + 大模型:打造真正能“看懂、想通、干成”的机械臂智能体

写在前面 在机器人圈子里&#xff0c;有个心照不宣的痛点&#xff1a;机械臂越来越便宜&#xff0c;但让它“听话”却越来越难。 传统的示教编程&#xff08;Teaching Pendant&#xff09;太慢&#xff0c;改个产品就得重教一遍&#xff1b;视觉定位&#xff08;Vision Guided&…...

Llama-3.2V-11B-cot高效部署:双卡4090下11B模型加载时间缩短至92s

Llama-3.2V-11B-cot高效部署&#xff1a;双卡4090下11B模型加载时间缩短至92s 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具。该工具针对双卡RTX 4090环境进行了深度优化&#xff0c;通过一系列技术创新将11B大模型的加…...

SDXL-Turbo在虚拟现实中的应用:实时环境生成技术

SDXL-Turbo在虚拟现实中的应用&#xff1a;实时环境生成技术 想象一下&#xff0c;在虚拟世界中每走一步&#xff0c;周围的景色就随之变化——茂密的森林在你眼前生长&#xff0c;古老的城堡在远处拔地而起&#xff0c;这一切都发生在眨眼之间。这不是魔法&#xff0c;而是SDX…...

系统提示msvcp140.dll丢失vcruntime140.dll丢失msvcr100.dll丢失mfc140u.dll丢失 怎么办?其他DLL错误修复

游戏文件打不开&#xff1f;DLL文件缺失&#xff1f;电脑崩溃&#xff1f;DirectX 轻松修复&#xff01;游戏运行库修复文件缺失软件必备安装工具&#xff0c; 这个DirectX 运行库修复工具&#xff0c;一键完成dll缺失修复、解决99.99%程序故障、闪退、卡顿等常见问题,轻松解决…...

NaViL-9B部署稳定性报告:7×24小时双卡运行内存泄漏监测

NaViL-9B部署稳定性报告&#xff1a;724小时双卡运行内存泄漏监测 1. 平台概述 NaViL-9B是一款原生多模态大语言模型&#xff0c;具备纯文本问答和图片理解双重能力。该模型经过特殊优化&#xff0c;可直接复用内置模型目录&#xff0c;无需二次下载大权重文件&#xff0c;显…...

nli-distilroberta-base实际项目:高校招生简章关键条款与考生疑问逻辑关系库构建

nli-distilroberta-base实际项目&#xff1a;高校招生简章关键条款与考生疑问逻辑关系库构建 1. 项目背景与需求 高校招生简章通常包含大量专业条款和政策说明&#xff0c;每年都会收到大量考生关于条款理解的咨询。传统的人工解答方式存在几个痛点&#xff1a; 效率低下&am…...

LFM2.5-1.2B-Thinking-GGUF代码生成能力评测:对比Claude Code的轻量化替代方案

LFM2.5-1.2B-Thinking-GGUF代码生成能力评测&#xff1a;对比Claude Code的轻量化替代方案 1. 评测背景与模型特点 在当今AI辅助编程领域&#xff0c;大型语言模型已经成为开发者日常工作的得力助手。然而&#xff0c;许多高性能模型往往需要云端部署或强大的计算资源&#x…...