news 2026/7/25 13:07:08

算法讲解8:搜索之bfs(广度优先)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法讲解8:搜索之bfs(广度优先)

搜索:穷尽所有的可能找到最优解,或统计和法解的个数

分类:dfs,bfs

特点:有多种优化方式,如减小状态空间,更改搜索顺序,剪枝等

对于bfs,每次都先处理该层图层

例题:

题目描述

小 A 有一棵 n 个结点的树,这些结点依次以 1,2,⋯,n 标号。

小 A 想在这棵树上漫步。具体来说,小 A 会从树上的某个结点出发,每一步可以移动到与当前结点相邻的结点,并且小 A 只会在偶数步(可以是零步)后结束漫步。

现在小 A 想知道,对于树上的每个结点,从这个结点出发开始漫步,经过偶数步能结束漫步的结点有多少个(可以经过重复的节点)。

输入格式

第一行,一个正整数 n。

接下来 n−1 行,每行两个整数 ui​,vi​,表示树上有⼀条连接结点 ui​ 和结点 vi​ 的边。

输出格式

一行,n 个整数。第 i 个整数表示从结点 i 出发开始漫步,能结束漫步的结点数量。

输入输出样例

输入 #1复制

3 1 3 2 3

输出 #1复制

2 2 1
import java.util.*;//一次性等于使用所有util的 //树是二分图(无奇环),任意两点的路径长度奇偶性固定 //需要二分 //- 同层节点(如偶-偶、奇-奇):层数差为0(偶数)→ 路径长度必为偶数; //- 异层节点(如偶-奇):层数差为1(奇数)→ 路径长度必为奇数; public class p11962 { static List<List<Integer>> adj;//邻接表 static int[] color; static int cnt0,cnt1;//静态修饰的默认为0 public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); adj = new ArrayList<>();//对邻接表的初始化 for (int i = 0; i <= n; i++) adj.add(new ArrayList<>());//每次循环给外层列表adj添加一个新的空arraylist,整体是邻接表的内层初始化 for (int i = 0; i < n-1; i++) { int u = sc.nextInt(), v = sc.nextInt(); adj.get(u).add(v);//节点u的相邻节点包含v adj.get(v).add(u);//就相当于一切的基础,相当于1棵树,不过两者相互连结需要在后面用 if (color[v] == -1)来保持正常 } color = new int[n+1]; Arrays.fill(color, -1);//将数组中所有的元素都初始化为-1 bfs(1); // 从节点1开始染色 // 输出每个节点的结果 for (int i = 1; i <= n; i++) { System.out.print((color[i] == 0 ? cnt0 : cnt1) + " "); }//color[i]=0说明是偶数分组,该组有几个就输出几个 //color=0 说明当前节点属于“偶层分组”,而偶层分组的所有节点,都能通过偶数步到达当前节点 //color=1 时,输出的是 cnt1 ——因为 color=1 表示当前节点属于“奇层分组”,该分组的所有节点都能通过偶数步到达当前节点, // cnt1 正是这个分组的总节点数。 } static void bfs(int start) {//广度优先搜索 Queue<Integer> q = new LinkedList<>(); q.add(start);//1.队列的作用:维持“待处理节点”顺序,确保先处理父节点、再处理子节点(符合树的层级遍历逻辑); color[start] = 0; cnt0++; while (!q.isEmpty()) {//队列不为空就持续染色 int u = q.poll();//取出头部,poll是取出并移除 for (int v : adj.get(u)) {//adj.u代表的是与节点u相邻的所有节点,整体上市遍历节点u相邻的所有节点后赋值给v if (color[v] == -1) {//保证只能被染色一次,想想之前输入的时候队adj做的,想象树从上往下找,这行代码就杜绝从下往上的可能 color[v] = color[u] ^ 1; // 0^1=1,1^1=0---v一定与u相邻,这行本质上就是,给v和u相反的颜色 if (color[v] == 0) cnt0++;//计数 else cnt1++; q.add(v);//这个队列在for循环的时候一直加 } } } } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/24 8:37:16

软件系统稳定性保障:压力测试、负载测试与容量测试的深度辨析

在现代软件工程中&#xff0c;性能测试是确保系统可靠性和用户体验的关键环节。其中压力测试、负载测试与容量测试作为性能测试体系的重要分支&#xff0c;常被从业人员混淆或误用。本文针对软件测试从业者群体&#xff0c;系统解析三者的核心区别、实施场景及技术要点&#xf…

作者头像 李华
网站建设 2026/7/24 21:56:13

并发测试中的五大常见陷阱与破解之道

并发时代的质量挑战 随着分布式架构与微服务普及&#xff0c;并发测试从可选项目变为质量保障的生命线。然而&#xff0c;由于并发缺陷的隐蔽性、非确定性和高复杂度&#xff0c;测试人员常陷入“认知偏差-工具误用-环境失真”的循环陷阱。本文结合典型场景&#xff0c;揭示并…

作者头像 李华
网站建设 2026/7/24 21:47:17

亥姆霍兹线圈在‌化学领域的主要应用

亥姆霍兹线圈在化学领域的主要应用集中在利用其产生的均匀磁场环境来研究物质的磁性特性以及相关化学过程。具体应用包括&#xff1a;磁性材料特性测量&#xff1a;用于测量磁性材料的磁化曲线、磁滞回线等参数&#xff0c;帮助分析材料的磁学行为&#xff0c;这在材料化学和固…

作者头像 李华
网站建设 2026/7/24 22:52:42

连续时间下的概率预测

用自然常数 eee 丈量时间与风险 ——从丙烷罐泄漏看连续时间下的概率预测摘要&#xff1a; 在工程与生活中&#xff0c;我们常被问到&#xff1a;“如果这件事每年发生的概率是 5%&#xff0c;那么 10 年后它发生的概率是多少&#xff1f;”直觉告诉我们是 50%&#xff0c;但数…

作者头像 李华
网站建设 2026/7/25 10:25:29

什么是网络安全CTF有何意义?该如何入门?

什么是网络安全CTF?有何意义 &#xff1f;该如何入门 &#xff1f; 什么是网络安全CTF? CTF在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。它起源于1996年DEFCON&#xff0c;以代替之前通过互相发起真实攻击进行技术比拼的方式。发展至今&#x…

作者头像 李华
网站建设 2026/7/24 10:09:19

适合自学的网络安全基础技能“蓝宝书”:《CTF那些事儿》

CTF比赛是快速提升网络安全实战技能的重要途径&#xff0c;已成为各个行业选拔网络安全人才的通用方法。但是&#xff0c;本书作者在从事CTF培训的过程中&#xff0c;发现存在几个突出的问题&#xff1a; 1&#xff09;线下CTF比赛培训中存在严重的 “最后一公里”问题 &#…

作者头像 李华