P11962 [GESP202503 六级] 树上漫步

[GESP202503 C++六级题解]:P11962:树上漫步 阅读详情

记录126

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;//定义常量N,表示树的最大节点数量(根据题目数据范围设定)
vector<int>g[N];//定义邻接表g,用来存储树的边连接关系
int color[N];//定义数组color,用来记录每个节点的染色情况(0代表一种颜色,1代表另一种)
int cnt[2];//定义数组cnt,用来统计两种颜色各自的节点总数量
int n;//定义全局变量n,表示树的结点总数
void dfs(int u,int c){//定义深度优先搜索函数,u是当前节点,c是当前节点的颜色
	color[u]=c;//将当前节点u染成颜色c
	cnt[c]++;//该颜色的节点计数器加一
	for(int v:g[u]){//遍历当前节点u的所有相邻节点v
		if(color[v]==-1){//如果相邻节点v还没有被染色(初始值为-1)
			dfs(v,c^1);//递归访问节点v,并将其染成与u相反的颜色(c^1实现0变1,1变0)
		}
	}
}
int main(){//主函数入口
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n;//读入树的结点总数n
	for(int i=1;i<n;i++){//循环读入n-1条边的信息
		int u,v;//定义临时变量u和v,代表一条边连接的两个结点
		cin>>u>>v;//读入这条边连接的两个结点编号
		g[u].push_back(v);//在邻接表中添加u到v的连接
		g[v].push_back(u);//在邻接表中添加v到u的连接(因为是无向树)
	}
	memset(color,-1,sizeof(color));//将color数组全部初始化为-1,表示所有节点均未染色
	dfs(1,0);//从1号节点开始进行DFS染色,将其初始颜色设为0
	for(int i=1;i<=n;i++){//遍历树上的每一个结点(从1到n)
		cout<<cnt[color[i]]<<" ";//输出当前结点i所属颜色的总节点数,并加上空格分隔
	}
	return 0;//程序正常结束
}

题目传送门https://www.luogu.com.cn/problem/P11962


前言

我是一名专注信奥赛(CSP-J/S、NOIP)的教练。

  • 如果你觉得这篇题解对你有帮助,欢迎点击关注我的优快云账号,我会持续更新高质量算法解析。
  • 我深知算法思维的构建远比单纯通过题目更重要,本系列题解不局限于AC代码的堆砌,而是致力于拆解题目背后的逻辑链条与核心知识点
  • 备赛路上若遇瓶颈,欢迎随时评论或私信,我将甄选典型疑难问题,通过视频讲解或撰写专项文章的形式,为你提供深度答疑。

 核心解题思路

这道题表面上看是一个复杂的图论搜索问题,但如果我们深入分析树的结构特性,就会发现它本质上是一个二分图染色问题。

  1. 奇偶步规律:在一棵树中,任意两个节点之间有且仅有一条简单路径。这意味着,从节点 A 走到节点 B,所需的步数(即路径长度)的奇偶性是绝对固定的。
  2. 二分图特性:树是一种特殊的二分图,不存在奇数环。我们可以对整棵树进行“黑白染色”(即代码中的 0 和 1):相邻的节点颜色必须不同。
  3. 核心结论:
    • 如果从节点 A 出发,走偶数步,那么最终停留的节点必定与节点 A 颜色相同。
    • 如果走奇数步,最终停留的节点必定与节点 A 颜色不同。
  4. 降维打击:题目要求计算从每个节点出发,走偶数步能到达的节点数(允许重复经过节点)。根据上述结论,这等价于统计与当前节点颜色相同的节点总数。我们只需要进行一次 DFS 遍历,统计出颜色 0 和颜色 1 的节点各有多少个,最后直接输出对应颜色的总数即可。时间复杂度从暴力搜索的 O(N2) 完美优化到了 O(N) 。

代码分块详细解释

1. 头文件、常量与全局变量定义

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10; // 定义常量 N,表示树的最大节点数量(根据题目数据范围 2*10^5 设定)
vector<int>g[N];    // 定义邻接表 g,用来存储树的边连接关系
int color[N];       // 定义数组 color,用来记录每个节点的染色情况(0代表一种颜色,1代表另一种)
int cnt[2];         // 定义数组 cnt,用来统计两种颜色各自的节点总数量
int n;              // 定义全局变量 n,表示树的结点总数
  • 作用:完成基础数据结构的定义。使用全局数组和 vector 邻接表,避免在 main 函数中开辟过大的局部数组导致栈溢出。

2. 核心逻辑:DFS 染色与统计

void dfs(int u,int c){ // 定义深度优先搜索函数,u是当前节点,c是当前节点的目标颜色
    color[u]=c;        // 将当前节点 u 染成颜色 c
    cnt[c]++;          // 该颜色的节点计数器加一
    for(int v:g[u]){   // 遍历当前节点 u 的所有相邻节点 v
        if(color[v]==-1){ // 如果相邻节点 v 还没有被染色(初始值为 -1)
            dfs(v,c^1);   // 递归访问节点 v,并将其染成与 u 相反的颜色(c^1 实现 0 变 1,1 变 0)
        }
    }
}
  • 作用:这是整个算法的核心。通过 DFS 遍历整棵树,利用异或运算 c^1 巧妙地实现相邻节点颜色交替。在遍历的过程中,顺便完成了两种颜色节点数量的统计。

3. 输入与初始化

int main(){ // 主函数入口
    ios::sync_with_stdio(false);
    cin.tie(0); // 关闭输入输出同步,提升读取速度
    cin>>n; // 读入树的结点总数 n
    for(int i=1;i<n;i++){ // 循环读入 n-1 条边的信息
        int u,v; // 定义临时变量 u 和 v,代表一条边连接的两个结点
        cin>>u>>v; // 读入这条边连接的两个结点编号
        g[u].push_back(v); // 在邻接表中添加 u 到 v 的连接
        g[v].push_back(u); // 在邻接表中添加 v 到 u 的连接(因为是无向树)
    }
    memset(color,-1,sizeof(color)); // 将 color 数组全部初始化为 -1,表示所有节点均未染色
    dfs(1,0); // 从 1 号节点开始进行 DFS 染色,将其初始颜色设为 0
  • 作用:读入树的结构,构建无向图。将颜色数组初始化为 -1 作为未访问的标记,随后从根节点 1 开始执行染色操作。

4. 输出结果

    for(int i=1;i<=n;i++){ // 遍历树上的每一个结点(从 1 到 n)
        cout<<cnt[color[i]]<<" "; // 输出当前结点 i 所属颜色的总节点数,并加上空格分隔
    }
    return 0; // 程序正常结束
}
  • 作用:根据前面统计好的 cnt 数组,直接以 O(1)O(1) 的时间复杂度查出每个节点对应的偶数步可达节点数,并格式化输出。

核心逻辑总结表

代码模块核心变量/操作精炼作用解决的痛点
图构建g[u].push_back(v)构建无向树邻接表存储节点间的连通关系,为遍历做准备
状态初始化memset(color,-1,...)标记所有节点未访问防止 DFS 过程中产生死循环或重复计算
DFS 染色dfs(v,c^1)相邻节点颜色交替利用二分图特性,将节点划分为奇偶两层
全局统计cnt[c]++累加各颜色节点总数避免对每个节点单独进行搜索,将复杂度降至 O(N)
结果映射cnt[color[i]]直接查表输出将复杂的“偶数步路径”问题转化为简单的“同色节点计数”问题

题解:洛谷 P11962 [GESP202503 六级] 树上漫步 等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。具体来说,小 A 会从树上的某个结点出发,每一步可以移动到与当前结点相邻的结点,并且小 A 只会在偶数步(可以是零步)后结束漫步。现在小 A 想知道,对于树上的每个结点,从这个结点出发开始漫步,经过偶数步能结束漫步的结点有多少个(可以经过重复的节点)。出发开始漫步,能结束漫步的结点数量。个结点的树,这些结点依次以。 阅读详情

相关推荐

GESP六级真题考点分析和解题思路

本文分析了GESP六级考试的18道真题,涵盖动态规划、树形结构、图论算法等核心考点。重点题目包括下楼梯(动态规划)、工作沟通(LCA算法)、运送物资(网络流)等。试题难度以普及级为主,涉及拓扑排序、树形DP、二分答案等典型算法。备考建议掌握动态规划状态转移、树结构的DFS遍历、图论算法实现等关键技能,并熟悉提供的代码模板(如拓扑排序和树直径计算)。通过系统练习这些高频题型和算法模板,可以有效提升六级考试通过率。

lan_in的博客 776

P11962 [GESP202503 六级] 树上漫步BFSvector 题解

本文介绍了解决树上漫步问题的算法。通过分析树结构的特性,发现结点间可达性与深度奇偶性相关:只有深度奇偶性相同的结点才能通过偶数步到达。算法首先构建树结构并计算各结点深度,然后统计深度奇偶性相同的结点数量。对于每个结点,输出与其同奇偶性的结点总数即可。该算法时间复杂度为O(n),空间复杂度为O(n),能高效解决问题。示例验证表明算法正确性,适用于各种规模的树结构。

Sanhai的博客 1013

RT-Thread stm32h7使用串口DMA

stm32h7在rtthread中无法使用串口DMA,通过更改驱动代码使其支持串口DMA

qq_35141454的博客 2288

P11962 [GESP202503 六级] 树上漫步(递归DFS + 优化)

本文介绍了一种基于递归DFS的树结构遍历优化算法。通过使用vector邻接表存储树结构,在DFS过程中实时统计节点深度并计算奇偶深度节点数量,算法实现了O(n)的时间复杂度。关键优化包括:输入输出加速、邻接表预分配、避免数据拷贝等。文章详细分析了算法的时间空间复杂度、正确性证明,并通过示例验证了算法的有效性。该解法简洁高效,能处理20万节点规模的数据,实际评测表现优异。

Sanhai的博客 944

【深大计算机网络】实验三 可靠传输机制 实验报告 附代码

【内附代码】【深大计算机网络】实验三 可靠传输机制 实验报告 附代码

m0_74268508的博客 1654

智能安防摄像头埋点实践:用户行为与设备状态的闭环监控(含AI事件)

智能安防摄像头埋点闭环体系设计及应用实践 摘要: 本文系统阐述了智能安防摄像头埋点闭环体系的设计与实践。首先分析了传统埋点的不足及闭环埋点的价值,提出由用户行为埋点、设备状态埋点和AI事件埋点构成的三维埋点体系框架。详细介绍了闭环监控的四大流程:数据采集、汇聚清洗、分析建模和智能决策。通过误报优化、个性化策略等案例展示了AI事件闭环的实际应用价值,并探讨了隐私合规、性能优化等关键挑战的解决思路。最后展望了端侧AI增强、预测型埋点等未来发展趋势。该体系实现了从数据采集到业务决策的完整闭环,有效提升了AI模型性

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 1050

【题解】【洛谷P11962】【树的遍历】 [GESP202503 六级] 树上漫步

具体来说,小 A 会从树上的某个结点出发,每⼀步可以移动到与当前结点相邻的结点,并且小 A 只会在偶数步(可以是零步)后结束漫步。由于树上两点间路径唯一,并且反复横跳也不会改变奇偶性,点不同的话,比如 u 到 v,我们也可以转化成 v 到 u。现在小 A 想知道,对于树上的每个结点,从这个结点出发开始漫步,经过偶数步能结束漫步的结点有多少个(可以经过重复的节点)。设从 1 号点开始能经过偶数条边到达的有 x 个点,那么从 1 号点开始经过奇数条边到达的自然就是 n−x 个点。),肯定超时,考虑优化。

Pantheraonca的博客 1040

实验三 Gmapping建图

自主移动机器人第三次实验课,内容包括:(1)turtlebot的gmapping建图;(2)rosbag的使用;(3)gazebo中的gmapping建图。

lj164567487的博客 4649

P11962 [GESP202503 六级] 树上漫步(邻接矩阵 + DFS 实现)

本文介绍了一种基于邻接矩阵和DFS的非递归算法,用于解决树结构中的节点深度统计问题。算法通过栈实现DFS遍历,计算每个节点的深度,并统计深度奇偶性相同的节点数量。该方法使用邻接矩阵存储树结构,时间复杂度为O(n²),空间复杂度为O(n²),适用于小规模树结构(n≤1000)。文章详细解析了算法实现细节,包括DFS遍历流程、避免重复访问的机制,并提供了性能分析和优化建议。通过示例验证了算法的正确性,展示了输入输出关系,最后对比了DFS与BFS实现的差异,为不同场景下的算法选择提供了参考。

Sanhai的博客 946

【CTFSHOW】web入门 黑盒测试

文章目录写在前面web380web381web382web383web384web385web386web387web388web389web390web391web392web393web394web395参考资料 写在前面 一直没搞过渗透,先学学黑盒测试吧 web380 进入题目发现是一个关于灯泡的悲伤故事,点进去,看到跳转到page_1.php页面。 我们访问page.php试试: 发现报错:$id.php,可以猜想需要传名称为id的参数,来访问id.php。我们访问page.php?id=1试试

7ruth0hn的博客 1898

Zynq7系列DDR3 PCB设计中的阻抗匹配与端接电阻优化策略

本文深入探讨了Zynq7系列SoC在DDR3接口PCB设计中的核心挑战,重点分析了走线阻抗与端接电阻的匹配策略。通过对比官方推荐的40欧姆与工程实践中更通用的50欧姆方案,结合仿真数据揭示了阻抗匹配对信号完整性的决定性影响,并提供了从叠层规划、布线优化到后期验证的完整实战清单,旨在帮助工程师实现高稳定性的高速电路设计。

weixin_29306011的博客 177

洛谷 P11962:[GESP202503 六级] 树上漫步 ← dfs + 链式前向星

以任意点为树根做一次 dfs,求出每个点的深度。深度为偶数的点可以通过偶数步到达深度为偶数的任意点,深度为奇数的点可以通过偶数步到达深度为奇数的任意点。

hnjzsyjyj的专栏 1096

Python爬虫实战:绕过B站-352风控的完整解决方案

网络爬虫技术是数据采集和自动化测试的重要工具,其核心原理是通过模拟HTTP请求获取网页数据。在实践过程中,开发者常会遇到网站反爬机制,这涉及请求指纹识别、IP行为分析等安全技术。这些风控措施的价值在于保护网站数据安全和服务器资源,广泛应用于电商、社交、内容平台等场景。针对B站等平台的-352风控错误,需要综合运用请求头伪装、会话管理、参数签名破解等技术方案。本文重点探讨如何通过构建完整的浏览器级请求头、管理Cookie会话、以及使用Playwright等浏览器自动化工具,有效解决Python爬虫在B站数据采

weixin_33912638的博客 404

P11962 [GESP202503 六级]树上漫步 - 静态数组实现BFS(链式前向星)

本文介绍了一种基于静态数组实现树遍历的高效算法。采用链式前向星存储树结构,使用数组模拟队列进行BFS遍历,计算各节点深度并统计奇偶深度节点数。该方法通过连续内存存储提升缓存命中率,避免动态分配开销,实现O(n)时空复杂度。特别适合处理大规模数据(n≤2×10^5),在保证性能的同时满足题目要求,提供了一种高效稳定的静态数组解决方案。

Sanhai的博客 276

2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录

由于是本人的亲身经历,所以想通过付费专栏获得一些收益。扣除平台的抽成后,我会将最终收益的一半捐献给贫困山区助学基金。专栏内容: 1. 几十场笔试真题的原题纯净版与个人解答版。 2. 几十场面试实录,包含提问、解答与个人复盘建议。 3. 个人整理的知识点总结。 4. 求职准备、简历制作方面的建议。

w0shishabi的博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

洛谷 P11962:[GESP202503 六级] 树上漫步 ← dfs + 邻接表

树在图论中是一种特殊的图,即无环连通图。

hnjzsyjyj的专栏 670

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

洛谷 P11962 [GESP202503 六级] 树上漫步-普及-

小 A 想在这棵树上漫步。具体来说,小 A 会从树上的某个结点出发,每⼀步可以移动到与当前结点相邻的结点,并且小 A 只会在偶数步(可以是零步)后结束漫步。现在小 A 想知道,对于树上的每个结点,从这个结点出发开始漫步,经过偶数步能结束漫步的结点有多少个(可以经过重复的节点)。随便找一个点深度优先搜索,将距离为1点两个点染成不同的两种颜色,然后统计每一颜色的个数。出发开始漫步,能结束漫步的结点数量。个结点的树,这些结点依次以。,表示树上有⼀条连接结点。对于所有测试点,保证。

weixin_37253733的博客 499

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

P11962 [GESP202503 六级] 树上漫步BFS(邻接矩阵实现)

本文介绍了使用邻接矩阵实现树结构遍历的算法。该实现通过二维数组存储节点连接关系,采用BFS计算每个节点的深度,并统计深度奇偶性节点数。邻接矩阵适用于小规模数据(n≤2000),时间复杂度为O(n²),空间复杂度为O(n²)。对于大规模数据,建议改用邻接表实现以获得更好的性能。文中详细说明了数据结构设计、算法流程、适用性限制及性能对比,为处理树结构问题提供了基础实现参考。

Sanhai的博客 661

《P11962 [GESP202503 六级] 树上漫步》

摘要:题目考察树结构中从各节点出发经偶数步可达的节点数。通过深度优先搜索(DFS)将节点按奇偶性分层,统计各层节点数。对于每个节点,答案为其所在层节点总数。例如样例1(3节点链)输出2,2,1;样例2(4节点树)输出3,3,1,3。算法时间复杂度O(n),适用于n≤2×10^5的数据规模。核心思想是利用树的二色染色性质,偶步可达性仅取决于起止节点的奇偶性是否相同。

Jasmine_llq的博客 182

P11962 [GESP202503 六级] 树上漫步BFS链式前向星解法

本文介绍了一种利用带权并查集解决网络连接和信息传播问题的高效算法。系统包含n台电脑,支持两种操作:连接两台电脑和在指定电脑发送信息。算法核心采用带权并查集结构,通过路径压缩和按秩合并优化性能,使用差值记录技术实现信息延迟更新。关键技巧包括在根节点记录信息总量、合并时维护信息差值、查询时计算实际值。该算法时间复杂度接近线性(O(mα(n))),能高效处理大规模数据。文章包含详细代码实现、操作解析和示例分析,展示了如何通过差值记录系统和路径压缩实现快速信息传播和查询。

Sanhai的博客 914

GESP认证C++编程真题解析 | 202503 六级

【题目来源】【题目描述】小 A 有一棵n个结点的树,这些结点依次以12⋯n标号。小 A 想在这棵树上漫步。具体来说,小 A 会从树上的某个结点出发,每⼀步可以移动到与当前结点相邻的结点,并且小 A 只会在偶数步(可以是零步)后结束漫步。现在小 A 想知道,对于树上的每个结点,从这个结点出发开始漫步,经过偶数步能结束漫步的结点有多少个(可以经过重复的节点)。【输入】第一行,一个正整数n。接下来n−1行,每行两个整数ui​vi​,表示树上有⼀条连接结点ui​。

团爸讲算法 470

CCF-GESP计算机学会等级考试2025年3月六级C++T1 树上漫步

小 A 有一棵n个结点的树,这些结点依次以12⋯n标号。小 A 想在这棵树上漫步。具体来说,小 A 会从树上的某个结点出发,每⼀步可以移动到与当前结点相邻的结点,并且小 A 只会在偶数步(可以是零步)后结束漫步。现在小 A 想知道,对于树上的每个结点,从这个结点出发开始漫步,经过偶数步能结束漫步的结点有多少个(可以经过重复的节点)。

长春高老师编程 1318

洛谷 P11962[GESP6]树上漫步

根据题意,不难发现如果将结点染色,相邻的结点染成不同的两种颜色,本题又要求走偶数步,即为求从一个结点出发,所能到达的颜色相同的节点数。

elseif123的博客 250

【GESP2503六级】树上漫步

【GESP2503六级】树上漫步

青少年趣味编程 800

记——那次难忘的GESP六级考试(202603)+编程题题解

本文记录了作者参加GESP六级考试的全过程,重点描述了备考和考试当天的经历。作者详细列出了自己完成的13道编程题目及解题思路,包括DP、贪心、树状数组等算法题,同时也提到未完成的8道题目。考试当天经历了忘带鼠标的意外,利用触控板继续练习。文章还提到选择题涉及动态规划、树遍历等基础知识,整体展现了作者从紧张备考到从容应考的心路历程,以及面对突发状况的应对能力。

2401_84010520的博客 641

【算法拾光】队列|在每个树⾏中找最⼤值 + 最后⼀块⽯头的重量

本文总结两道经典算法题:一是通过层序遍历(BFS)逐层找最大值,利用队列分层处理,每层维护最大值;二是用大根堆(优先队列)模拟石头碰撞过程,每次取最大两块石头,差值重新入堆,直至剩余一块或无石。前者适用于树的层次遍历,后者适合动态获取最值场景。核心思想:队列用于分层遍历,堆用于高效取极值。

wuqingyigexiaoba的博客 131
上一篇: P2947 [USACO09MAR] Look Up S
下一篇: P11963 [GESP202503 六级] 环线
谢天谢地AC了 | 信奥教练
博客等级 码龄1年 53粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值