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

题解:洛谷 P3398 仓鼠找 sugar

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

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

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


【题目来源】

洛谷:P3398 仓鼠找 sugar - 洛谷

【题目描述】

小仓鼠的和他的基(mei)友(zi)sugar 住在地下洞穴中,每个节点的编号为1 ∼ n 1\sim n1n。地下洞穴是一个树形结构。这一天小仓鼠打算从从他的卧室(a aa)到餐厅(b bb),而他的基友同时要从他的卧室(c cc)到图书馆(d dd)。他们都会走最短路径。现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友?

小仓鼠那么弱,还要天天被 zzq 大爷虐,请你快来救救他吧!

【输入】

第一行两个正整数n nnq qq,表示这棵树节点的个数和询问的个数。

接下来n − 1 n-1n1行,每行两个正整数u uuv vv,表示节点u uu到节点v vv之间有一条边。

接下来q qq行,每行四个正整数a aab bbc ccd dd,表示节点编号,也就是一次询问,其意义如上。

【输出】

对于每个询问,如果有公共点,输出大写字母Y;否则输出N

【输入样例】

5 5 2 5 4 2 1 3 1 4 5 1 5 1 2 2 1 4 4 1 3 4 3 1 1 5 3 5 1 4

【输出样例】

Y N Y Y Y

【算法标签】

#普及plus #最近公共祖先

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;constintN=100005,M=N*2;intn,Q;// n: 节点数,Q: 查询次数intdep[N];// 节点深度intfa[N][20];// 倍增数组,fa[i][j]表示节点i向上跳2^j步到达的祖先节点queue<int>q;// BFS队列inth[N],e[M],ne[M],idx;// 邻接表存储树// 添加无向边voidadd(inta,intb){e[idx]=b,ne[idx]=h[a],h[a]=idx++;}// 预处理节点深度和倍增数组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]){intj=e[i];// 子节点jif(dep[j]>dep[t]+1)// 如果j的深度大于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<=19;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])// 保证x为深度较大的节点swap(x,y);// 步骤1:把节点x向上跳,直到与节点y深度相同for(intk=19;k>=0;k--)// 从高位开始尝试跳if(dep[fa[x][k]]>=dep[y])x=fa[x][k];if(x==y)// 如果跳完后x等于y,说明y是x的祖先returnx;// 步骤2:两个节点同时向上跳,跳到公共祖先的下一层for(intk=19;k>=0;k--){if(fa[x][k]!=fa[y][k])// 如果跳2^k步后祖先不同{x=fa[x][k];y=fa[y][k];}}returnfa[x][0];// 返回x的父节点,即x和y的最近公共祖先}// 计算节点a和节点b之间的距离intdist(inta,intb){intp=lca(a,b);// 求最近公共祖先returndep[a]+dep[b]-2*dep[p];// 距离 = a深度 + b深度 - 2*lca深度}intmain(){memset(h,-1,sizeof(h));cin>>n>>Q;for(inti=1;i<n;i++)// 输入n-1条边{intu,v;cin>>u>>v;add(u,v),add(v,u);// 添加无向边}bfs(1);// 从节点1开始预处理深度和倍增数组while(Q--){inta,b,c,d;cin>>a>>b>>c>>d;intab=dist(a,b);// 路径a-b的距离intcd=dist(c,d);// 路径c-d的距离intac=dist(a,c);// 节点a到节点c的距离intbd=dist(b,d);// 节点b到节点d的距离intad=dist(a,d);// 节点a到节点d的距离intbc=dist(b,c);// 节点b到节点c的距离// 判断路径a-b和c-d是否有交点// 条件:路径a-b和c-d有交点当且仅当ab+cd >= max(ac+bd, ad+bc)if(ab+cd>=ac+bd&&ab+cd>=ad+bc)cout<<"Y"<<endl;elsecout<<"N"<<endl;}return0;}

【运行结果】

5 5 2 5 4 2 1 3 1 4 5 1 5 1 Y 2 2 1 4 N 4 1 3 4 Y 3 1 1 5 Y 3 5 1 4 Y
http://www.jsqmd.com/news/861637/

相关文章:

  • Open MCT性能测试实战:JMeter多协议分层压测方法
  • Chrome多进程沙箱机制原理解析与安全加固实践
  • pytest Code Review skill.md
  • Burp Suite混合加密流量解密实战:JS+Native加解密链路还原
  • AI漫剧创作教程:体验更流畅的创作流程,更好的效果
  • SpaceX启动纳斯达克IPO,1.75万亿美元市值目标能否实现?
  • TensorFlow模型API安全扫描与漏洞修复实战指南
  • edu 域名注册之旅
  • 听劝和辨劝
  • 2026成都租客车:成都租旅游大巴车、成都租旅游车、四川大巴包车、四川大巴租赁、四川大巴车租赁、四川客车租赁、四川旅游大巴车租赁选择指南 - 优质品牌商家
  • 2026年现阶段福州文化墙制作公司深度解析与核心厂商推荐 - 2026年企业推荐榜
  • Midjourney玻璃表现TOP3失败案例(含错误参数截图+修复前后PSD对比),工程师私藏调试日志首次公开
  • 2026年5月兰州装修设计质量排行:兰州装饰公司、兰州本地装修公司、兰州装修公司、兰州装修工作室、兰州装修设计公司选择指南 - 优质品牌商家
  • 题解:洛谷 P1670 [USACO04DEC] Tree Cutting S
  • Unity配置管理实战:Luban实现Excel到C#类型安全配置
  • B站成分检测器:揭秘评论区背后的用户画像,3分钟开启智能社交分析
  • PHP版本升级不是换镜像:漏洞修复中的兼容性实战指南
  • 基于CC2530 ZigBee的智慧农业控制系统:从硬件设计到低功耗组网实战
  • Godot内存泄漏三大根源与自动化防治方案
  • 2025降AI工具测评:10款实测软件附免费方案
  • Chromium沙箱机制与GPU进程安全实践指南
  • 2026耐高温涂料技术解析:户外工程防腐涂料、无毒油漆、无毒饮水舱油漆、无毒饮水舱涂料、无溶剂环氧涂料、机场钢结构防腐涂料选择指南 - 优质品牌商家
  • WebStorm 保存文件时自动格式化失败报错怎么修复?
  • Pandas 核心操作指南:索引、筛选、赋值与函数应用
  • GGUF支持Llama-4无损量化教程
  • 2026年热门的分散印染印花助剂定制加工厂家推荐 - 品牌宣传支持者
  • 2026年临沂成人高考报名机构选择实操指南:中宏教育联系、临沂老牌函授站、临沂非脱产、国家开放大学函授站、山东学历提升选择指南 - 优质品牌商家
  • WebSocket压测实战:从协议原理到高并发稳定性验证
  • RT-Trace升级:集成GDB Server与一键烧录,打造嵌入式开发调试平台
  • PHP版本漏洞修复:从运行时依赖分析到四路径修复