news 2026/4/21 20:48:03

算法竞赛备考冲刺必刷题(C++) | 洛谷 P10289 小杨的旅游

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法竞赛备考冲刺必刷题(C++) | 洛谷 P10289 小杨的旅游

本文分享的必刷题目是从蓝桥云课洛谷AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现!

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

洛谷:[P10289 GESP样题 八级] 小杨的旅游 - 洛谷

【题目描述】

小杨准备前往 B 国旅游。

B 国有n nn座城市,这n nn座城市依次以1 11n nn编号。城市之间由n − 1 n-1n1条双向道路连接,任意两座城市之间均可达(即任意两座城市之间存在可达的路径)。

小杨可以通过双向道路在城市之间移动,通过一条双向道路需要1 11单位时间。

B 国城市中有k kk座城市设有传送门。设有传送门的城市的编号依次为b 1 , b 2 , ⋯ , b k b_1,b_2, \cdots ,b_kb1,b2,,bk。小杨可以从任意一座设有传送门的城市花费0 00单位时间前往另一座设有传送门的城市。

注:如果两座设有传送门的城市之间存在双向道路,那么小杨可以选择通过双向道路移动,也可以选择通过传送门传送。

小杨计划在 B 国旅游q qq次。第i ii次旅游(1 ≤ i ≤ q 1 \le i \le q1iq),⼩杨计划从编号为u i u_iui的城市前往编号为v i v_ivi的城市,小杨希望你能求出所需要的最短时间。

【输入】

第一行包含三个正整数n , k , q n,k,qn,k,q,分别表示 B 国的城市数量,设有传送门的城市数量,以及小杨计划在 B 国旅游的次数。
接下来n − 1 n-1n1行,每行包含两个正整数x i , y i x_i, y_ixi,yi,表示一条双向道路连接的两座城市的编号。
n + 1 n + 1n+1行包含k kk个正整数,表示设有传送门的城市的编号。
接下来q qq行,每行包含两个正整数u i , v i u_i,v_iui,vi,表示小杨第i ii次旅游行程的起点城市编号与终点城市编号。

【输出】

输出共q qq行。第i ii行(1 ≤ i ≤ q 1 \leq i \leq q1iq)输出一个非负整数,表示小杨计划第i ii次旅游从编号为u i u_iui的城市前往编号为v i v_ivi的城市所需要的最短时间。

【输入样例】

7 2 1 5 7 3 6 2 3 1 5 5 4 1 2 7 4 3 7

【输出样例】

4

【算法标签】

《洛谷 P10289 小杨的旅游》 #广度优先搜索BFS# #最短路# #最近公共祖先LCA# #GESP#

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;constintN=200005,M=N*2;// N: 最大节点数, M: 最大边数typedefpair<int,int>PII;// 定义pair类型,用于存储节点和步数intn,k,Q;// n: 节点数, k: 特殊节点数, Q: 查询次数inth[N],e[M],ne[M],idx;// 邻接表存储树intdep[N],dep2[N],fa[N][30];// dep: 节点深度, dep2: 到最近特殊节点的距离, fa: 倍增祖先表boolst[N];// 标记数组,用于BFS2queue<int>q;// BFS队列queue<PII>q2;// 多源BFS队列// 添加无向边voidadd(inta,intb){e[idx]=b,ne[idx]=h[a],h[a]=idx++;// 添加边a->b}// 预处理节点深度和倍增祖先表voidbfs(introot){memset(dep,0x3f,sizeof(dep));// 初始化为无穷大dep[0]=0,dep[root]=1;// 虚拟0节点深度为0, 根节点深度为1q.push(root);while(!q.empty())// 计算节点深度{intt=q.front();q.pop();for(inti=h[t];i!=-1;i=ne[i])// 遍历节点t的所有邻接点{intj=e[i];// 邻接节点jif(dep[j]>dep[t]+1)// 如果j的深度还未计算{dep[j]=dep[t]+1;// 计算j的深度q.push(j);// j入队fa[j][0]=t;// j向上走2^0=1步即为父节点tfor(intk=1;k<=29;k++)// 递推计算fa[j][k]{// j向上走2^k步等于j向上走2^(k-1)步后, 再向上走2^(k-1)步fa[j][k]=fa[fa[j][k-1]][k-1];}}}}}// LCA倍增算法,计算节点x和节点y的最近公共祖先intlca(intx,inty){if(dep[x]<dep[y])swap(x,y);// 保证x为深度较大的节点// 步骤1:把节点x向上跳,直到与节点y深度相同for(intk=29;k>=0;k--)// 从高位向低位尝试if(dep[fa[x][k]]>=dep[y])x=fa[x][k];// 如果跳2^k步后深度仍大于等于y, 就跳if(x==y)returnx;// 如果x和y已经相同, 则找到LCA// 步骤2:两个节点同时向上跳,跳到公共祖先的下一层for(intk=29;k>=0;k--){if(fa[x][k]!=fa[y][k])// 如果跳2^k步后祖先不同, 就都跳上去{x=fa[x][k];y=fa[y][k];}}returnfa[x][0];// 返回x或y的父节点, 即为最近公共祖先}// 多源BFS,计算每个节点到最近特殊节点的距离voidbfs2(){while(!q2.empty()){intu=q2.front().first;// 当前节点intstep=q2.front().second;// 到起点的距离// cout << "u step " << u << " " << step << endl;q2.pop();for(inti=h[u];i!=-1;i=ne[i])// 遍历u的所有邻接节点{intj=e[i];// 邻接节点jif(st[j])continue;// 如果j已访问,跳过dep2[j]=step+1;// 更新j到最近特殊节点的距离q2.push({j,step+1});// j入队st[j]=1;// 标记j已访问}}}intmain(){cin>>n>>k>>Q;// 输入节点数、特殊节点数、查询次数memset(h,-1,sizeof(h));// 初始化邻接表// 输入n-1条边,构建树for(inti=1;i<n;i++){intx,y;cin>>x>>y;add(x,y),add(y,x);// 添加无向边}// 初始化特殊节点for(inti=1;i<=k;i++){intx;cin>>x;// 输入特殊节点编号dep2[x]=0;// 特殊节点到自身的距离为0q2.push({x,0});// 特殊节点入队st[x]=1;// 标记特殊节点已访问}bfs(1);// 从节点1开始BFS,预处理深度和祖先表// 调试输出深度// for (int i=1; i<=n; i++)// cout << dep[i] << " ";// cout << endl;bfs2();// 多源BFS,计算每个节点到最近特殊节点的距离// 处理Q个查询while(Q--){intx,y;cin>>x>>y;// 输入查询的两个节点inttmp=lca(x,y);// 计算x和y的最近公共祖先intans;if(k!=0)// 如果有特殊节点// 两种走法的较小值:// 1. 直接走树边:x到y的距离 = dep[x] + dep[y] - 2*dep[tmp]// 2. 通过特殊节点:x到最近特殊节点的距离 + y到最近特殊节点的距离ans=min(dep[x]-dep[tmp]+dep[y]-dep[tmp],dep2[x]+dep2[y]);else// 如果没有特殊节点,只能走树边ans=dep[x]-dep[tmp]+dep[y]-dep[tmp];cout<<ans<<endl;// 输出结果}// 调试输出每个节点到最近特殊节点的距离// for (int i=1; i<=n; i++)// {// cout << dep2[i] << " ";// }// cout << endl;return0;}

【运行结果】

7 2 1 5 7 3 6 2 3 1 5 5 4 1 2 7 4 3 7 4
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:41:21

AI视觉落地新方向:M2FP人体解析助力智能零售场景升级

AI视觉落地新方向&#xff1a;M2FP人体解析助力智能零售场景升级 在智能零售、无人门店、客流分析等场景中&#xff0c;传统的人体检测与行为识别技术已难以满足精细化运营的需求。如何从视觉层面深入理解顾客的穿着特征、身体姿态与空间分布&#xff0c;成为提升用户体验和优化…

作者头像 李华
网站建设 2026/4/21 2:44:54

Z-Image-Turbo英文提示词结构设计技巧

Z-Image-Turbo英文提示词结构设计技巧 引言&#xff1a;从中文到英文提示词的进阶之路 随着阿里通义Z-Image-Turbo WebUI图像生成模型的普及&#xff0c;越来越多用户开始探索如何通过精准的提示词&#xff08;Prompt&#xff09; 提升生成图像的质量与可控性。虽然该工具支持中…

作者头像 李华
网站建设 2026/4/15 16:56:10

基于M2FP的智能健身分析系统:实时动作识别前端搭建

基于M2FP的智能健身分析系统&#xff1a;实时动作识别前端搭建 在构建智能健身分析系统的完整技术链路中&#xff0c;精准的人体结构感知是实现后续动作识别、姿态评估与运动反馈的核心前提。传统姿态估计算法&#xff08;如OpenPose&#xff09;虽能提供关键点信息&#xff0…

作者头像 李华
网站建设 2026/4/16 12:51:10

Z-Image-Turbo现代都市夜景生成质量

Z-Image-Turbo现代都市夜景生成质量 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥本文聚焦于Z-Image-Turbo在“现代都市夜景”这一复杂视觉场景下的生成表现&#xff0c;结合实际使用经验与参数调优策略&#xff0c;深入分析其图像质量、细节还原能力与风格…

作者头像 李华
网站建设 2026/4/18 12:35:08

Z-Image-Turbo云边协同方案:云端训练+边缘推理一体化

Z-Image-Turbo云边协同方案&#xff1a;云端训练边缘推理一体化 引言&#xff1a;AI图像生成的效率革命 随着AIGC&#xff08;人工智能生成内容&#xff09;技术的爆发式发展&#xff0c;图像生成模型正从实验室走向实际应用。然而&#xff0c;大模型在部署过程中面临两大核心…

作者头像 李华
网站建设 2026/4/13 1:41:58

Z-Image-Turbo时间流逝:昼夜交替与四季变换表现

Z-Image-Turbo时间流逝&#xff1a;昼夜交替与四季变换表现 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥 在AI图像生成领域&#xff0c;静态场景已无法满足日益增长的创意需求。如何通过提示词工程和参数调控&#xff0c;让AI理解并呈现“时间”这一抽象维…

作者头像 李华