AcWing 4963:砍树 ← 树上差分(边差分)+ dfs预处理

news/2026/1/22 9:06:49/文章来源:https://www.cnblogs.com/triwa/p/19515037

【题目来源】
https://www.acwing.com/problem/content/4966/

【题目描述】
给定一棵由 n 个结点组成的树以及 m 个不重复的无序数对(a1, b1),(a2, b2),…,(am, bm),其中 ai 互不相同,bi 互不相同,ai≠bj(1≤i, j≤m)。
小明想知道是否能够选择一条树上的边砍断,使得对于每个(ai, bi)满足 ai 和 bi 不连通,如果可以则输出应该断掉的边的编号(编号按输入顺序从 1 开始),否则输出 -1。

【输入格式】
输入共 n+m 行,第一行为两个正整数 n,m。
后面 n-1 行,每行两个正整数 xi,yi 表示第 i 条边的两个端点。
后面 m 行,每行两个正整数 ai,bi。​​​​​​​

【输出格式】
一行一个整数,表示答案,如有多个答案,输出编号最大的一个。​​​​​​​

【输入样例】
6 2
1 2
2 3
4 3
2 5
6 5
3 6
4 5

【输出样例】
4

【样例解释】
断开第 2 条边后形成两个连通块:{3,4},{1,2,5,6},满足 3 和 6 不连通,4 和 5 不连通。
断开第 4 条边后形成两个连通块:{1,2,3,4},{5,6},同样满足 3 和 6 不连通,4 和 5 不连通。
4 编号更大,因此答案为 4。

【数据范围】
对于 30% 的数据,保证 1<n≤1000。
对于 100% 的数据,保证 1<n≤10^5,1≤m≤n/2。​​​​​​​

【算法分析】
● 树上差分
树上差分是一种在树上高效处理路径修改和查询的算法技巧,核心思想是将路径操作转化为对节点差分数组的单点修改,最后通过一次遍历还原出结果。 它特别适合处理‌多次对树上路径进行加减操作,最后查询某个点或边的权值‌这类问题。
(一)核心思想
点差分‌:对路径 (x, y) 上所有点的权值进行修改。通过在 x 和 y 处 +val,在 lca(x,y) 和其父节点处 -val,最后通过 DFS 自底向上求和即可还原路径上的权值。具体操作为:对路径 (x, y) 加 val,执行 diff[x] += val, diff[y] += val, diff[lca] -= val, diff[fa[lca]] -= val。
边差分‌:对路径 (x, y) 上所有边的权值进行修改。通常将边权下放给深度较大的子节点,转化为点权问题,处理方式与点差分类似。具体操作为:对路径 (x, y) 加 val,执行 diff[x] += val, diff[y] += val, diff[lca] -= 2 * val(假设边权下放给子节点)。
(二)适用场景
点差分‌:路径点权修改、子树点权修改、查询点权。
边差分‌:路径边权修改、查询边权。
(三)与其他算法对比
与线段树对比‌:树上差分代码简洁,适合离线操作;线段树支持在线查询,但常数较大。
与树链剖分对比‌:树上差分处理路径修改更高效;树链剖分功能更强大,支持复杂路径查询。

● LCA ← 树上差分常用 LCA
(1)暴力法(向上标记法):https://blog.csdn.net/hnjzsyjyj/article/details/152026341
(2)暴力法(同步前进法‌):https://blog.csdn.net/hnjzsyjyj/article/details/152070927
(3)倍增法(DFS预处理):https://blog.csdn.net/hnjzsyjyj/article/details/152203103
(4)倍增法(BFS预处理):​​​​​​​https://blog.csdn.net/hnjzsyjyj/article/details/152234376

【算法代码:dfs预处理
视频讲解详见:https://www.bilibili.com/video/BV1bg4y127QH/

#include<bits/stdc++.h>
using namespace std;typedef long long LL;
typedef pair<int,int> PII;
const int N=2e5+5;
const int LOG=20;
vector<int> g[N];
map<PII,int> mp;
int dep[N],f[N][LOG+5];
int d[N];
int n,m,ans;void dfs1(int u,int fa) { //preprocessdep[u]=dep[fa]+1;f[u][0]=fa;for(int i=1; (1<<i)<=dep[u]; i++) { //i<=LOGf[u][i]=f[f[u][i-1]][i-1];}for(auto j:g[u]) {if(j!=fa) dfs1(j,u);}
}int getLCA(int u,int v) {if(dep[u]<dep[v]) swap(u,v);for(int i=LOG; i>=0; i--) {if(dep[f[u][i]]>=dep[v]) u=f[u][i];}if(u==v) return u;for(int i=LOG; i>=0; i--) {if(f[u][i]!=f[v][i]) {u=f[u][i],v=f[v][i];}}return f[u][0];
}int dfs2(int u,int fa) {int res=d[u];for(auto j:g[u]) {if(j==fa) continue;int cnt=dfs2(j,u);if(cnt==m) {ans=max(ans,mp[{j,u}]);}res+=cnt;}return res;
}int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1; i<n; i++) {int u,v;cin>>u>>v;mp[{u,v}]=mp[{v,u}]=i;g[u].push_back(v);g[v].push_back(u);}dfs1(1,-1);for(int i=1; i<=m; i++) {int x,y;cin>>x>>y;int lca=getLCA(x,y);d[x]++,d[y]++,d[lca]-=2;}dfs2(1,-1);cout<<(ans==0?-1:ans)<<'\n';return 0;
}/*
in:
6 2
1 2
2 3
4 3
2 5
6 5
3 6
4 5out:
4
*/





【参考文献】
https://www.bilibili.com/video/BV1bg4y127QH
https://www.cnblogs.com/Chase-s/p/10410265.html
https://www.cnblogs.com/hetailang/p/16216504.html
https://blog.51cto.com/u_13536312/5371363
https://www.acwing.com/solution/content/186355/


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1199197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

笔记 - 电脑更换主板后需要重新更新驱动或激活的部分

笔记 - 电脑更换主板后需要重新更新驱动或激活的部分重装系统或更换主板等大维修后,需要在爱机上重新手动进行的配置笔记。方法来源于网络,仅总结方便自查。本文是我去换主板之后发现的一些 电脑拿回手里后需要手动重…

基于SenseVoice Small实现多语言语音识别与情感分析

基于SenseVoice Small实现多语言语音识别与情感分析 1. 引言&#xff1a;为什么我们需要更智能的语音识别&#xff1f; 你有没有遇到过这样的场景&#xff1f;一段录音里既有说话声&#xff0c;又有背景音乐、笑声甚至咳嗽声&#xff0c;传统语音识别只能告诉你“说了什么”&…

es配置x-pack使用账号密码验证

1.修改配置添加如下选项 xpack.security.enabled: true2.启动测试 curl -H "Content-Type:application/json" -XPOST http://172.16.10.61:29200/_xpack/license/start_trial?acknowledge=true {"ack…

小白也能懂的BEV+Transformer:PETRV2模型保姆级教程

小白也能懂的BEVTransformer&#xff1a;PETRV2模型保姆级教程 在自动驾驶技术飞速发展的今天&#xff0c;如何让车辆“看”得更清楚、理解得更全面&#xff0c;是整个系统的核心挑战。传统的感知方法依赖激光雷达或单一视角摄像头&#xff0c;存在成本高、视野受限等问题。而…

AI绘画成本太高?麦橘超然免费离线方案实战评测

AI绘画成本太高&#xff1f;麦橘超然免费离线方案实战评测 你是不是也遇到过这种情况&#xff1a;想用AI画画&#xff0c;结果发现要么要充会员、买算力卡&#xff0c;要么就得有高端显卡&#xff1f;动辄几十上百的月费&#xff0c;或者一张3090起步的硬件门槛&#xff0c;确…

实测分享:YOLO11在复杂场景下的检测效果

实测分享&#xff1a;YOLO11在复杂场景下的检测效果 1. 引言&#xff1a;为什么选择YOLO11做复杂场景检测&#xff1f; 目标检测是计算机视觉中最核心的任务之一&#xff0c;而现实中的应用场景往往并不理想——遮挡严重、光照多变、目标密集、尺度差异大。在这些“复杂场景”…

OCR预处理怎么做?图像去噪增强配合cv_resnet18提效

OCR预处理怎么做&#xff1f;图像去噪增强配合cv_resnet18提效 1. 引言&#xff1a;为什么OCR前的图像预处理如此关键&#xff1f; 你有没有遇到过这样的情况&#xff1a;一张照片里的文字明明看得清&#xff0c;但扔给OCR模型就是识别不出来&#xff1f;或者识别结果乱码、漏…

2026年性价比靠谱的办公设计专业公司推荐

2026年企业数字化转型深入推进的背景下,办公空间已不再是简单的物理场所,而是承载企业品牌形象、驱动团队协作效率、助力业务增长的核心载体。无论是彰显品牌底蕴的总部空间、适配灵活协作的联合办公场域,还是聚焦创…

2026年知名的悬链式抛丸机公司哪家靠谱?专业测评

在悬链式抛丸机领域选择供应商时,应重点考察企业的技术积累、生产规模、研发投入和行业口碑。经过对国内主要生产厂家的实地考察和市场调研,我们推荐将江苏龙发铸造除锈设备有限公司作为优先参考厂家之一。该公司作为…

小白友好!一键启动Qwen2.5-7B微调环境,无需配置

小白友好&#xff01;一键启动Qwen2.5-7B微调环境&#xff0c;无需配置 你是不是也曾经被大模型微调的复杂环境劝退&#xff1f;装依赖、配CUDA、调参数……光是准备阶段就能耗掉一整天。今天&#xff0c;我们彻底告别这些烦恼——只需一键&#xff0c;就能在单张RTX 4090D上&…

MinerU内存泄漏排查:长时间运行稳定性测试

MinerU内存泄漏排查&#xff1a;长时间运行稳定性测试 1. 背景与问题引入 在使用 MinerU 2.5-1.2B 深度学习 PDF 提取镜像进行大规模文档处理时&#xff0c;我们发现系统在长时间连续运行多个提取任务后出现显存占用持续上升、进程卡顿甚至崩溃的现象。这一行为初步判断为存在…

基于Java+Springboot+Vue开发的新闻管理系统源码+运行步骤+计算机技术

项目简介该项目是基于Java+Springboot+Vue开发的新闻管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习…

【数据可视化必备技能】:Python动态设置Excel单元格颜色实战代码

第一章&#xff1a;Python操作Excel的基础环境搭建在进行Python对Excel文件的读写操作前&#xff0c;需先配置合适的开发环境。Python本身不直接支持Excel格式&#xff0c;因此需要借助第三方库来实现。最常用的是openpyxl和pandas&#xff0c;前者专用于处理.xlsx文件&#xf…

工业缺陷检测新方案,YOLOv9镜像快速实现

工业缺陷检测新方案&#xff0c;YOLOv9镜像快速实现 在现代智能制造场景中&#xff0c;工业缺陷检测正从传统人工目检向自动化、智能化视觉系统演进。然而&#xff0c;搭建一个高效稳定的目标检测系统往往面临环境配置复杂、依赖冲突频发、训练推理链路断裂等现实问题。尤其对…

Z-Image-Turbo支持LoRA微调吗?模型扩展性部署分析

Z-Image-Turbo支持LoRA微调吗&#xff1f;模型扩展性部署分析 1. 引言&#xff1a;Z-Image-Turbo为何值得关注&#xff1f; 如果你正在寻找一个开箱即用、推理极快、画质出色的文生图AI模型&#xff0c;那么阿里达摩院推出的 Z-Image-Turbo 很可能已经进入你的视野。它基于Di…

告别复杂配置:HY-MT1.5-7B镜像化部署,十分钟启动翻译API

告别复杂配置&#xff1a;HY-MT1.5-7B镜像化部署&#xff0c;十分钟启动翻译API 在多语言交流日益频繁的今天&#xff0c;高质量、低门槛的机器翻译能力已成为企业出海、政府服务、教育普及和内容本地化的刚需。然而&#xff0c;大多数开源翻译模型仍停留在“能跑”阶段——依…

UnicodeDecodeError ‘utf-8‘ codec can‘t decode,99%的人都忽略的这5个细节

第一章&#xff1a;UnicodeDecodeError utf-8 codec cant decode 错误的本质解析 在处理文本数据时&#xff0c;UnicodeDecodeError: utf-8 codec cant decode 是 Python 开发者常见的异常之一。该错误通常发生在尝试使用 UTF-8 解码器解析非 UTF-8 编码的字节序列时&#xff…

Qwen3-4B vs 国产模型对比:综合能力与部署成本评测

Qwen3-4B vs 国产模型对比&#xff1a;综合能力与部署成本评测 1. 背景与测试目标 大模型的落地应用正从“能不能用”转向“好不好用、划不划算”。在众多开源模型中&#xff0c;Qwen3-4B-Instruct-2507作为阿里通义千问系列的新一代4B级文本生成模型&#xff0c;一经发布就引…

基于SpringBoot的工资信息管理系统毕设源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。 一、研究目的 本研究旨在设计并实现一个基于SpringBoot框架的工资信息管理系统。该系统旨在解决传统工资管理方式中存在的效率低下、数据不准确、操作复杂等问题。具体研究…

C语言-单向循环链表不带头节点的基本操作(增、删、改、查)

C语言-单向循环链表不带头节点的基本操作(增、删、改、查) 前言 这篇博客将带你从零开始,逐步实现一个不带头节点的单向循环链表,并完成其创建、遍历、增、删、改、查等核心操作。我们将重点关注那些容易出错的边界…