【蓝桥杯】砍树(树上差分)

news/2024/12/23 6:02:57/

考察知识点:树上差分

问题描述

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

输入格式

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

输出格式

一行一个整数,表示答案,如果有多个答案,输出编号最大的一个。

思路

1、按顺序输入每条边(无向边),使用邻接表储存图。

2、使用dfs方法确定每个点所处的层次,0处于第0层,以1为根节点,处于第1层。

3、输入每个数对a,b,d[a] ++,d[b] ++,求出点a与点b最近的公共祖先节点p,d[p] -= 2;

4、使用深度遍历每个点,求出每条边当前的权值,如果等于m则表示这条边可以砍掉,如果边的编号大于ans,则使用ans保存。

5、输出答案。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 101000, M = 2 * N;
int n,m;
int h[N],e[M],ne[M],idx;
int depth[N],fa[N][25];
int d[N];
int q[N];
int ans;
void add(int a,int b)
{e[idx] = b,ne[idx] = h[a], h[a] = idx ++;
}void bfs()
{memset(depth,0x3f,sizeof depth);depth[0] = 0;depth[1] = 1;queue<int> q;q.push(1);while(!q.empty()){int t = q.front();q.pop();for(int i = h[t]; ~i; i = ne[i]){int j = e[i];if(depth[j] > depth[t] + 1){depth[j] = depth[t] + 1;q.push(j);fa[j][0] = t;for(int k = 1; k <= 16; k ++)fa[j][k] = fa[fa[j][k - 1]][k - 1];}}}
}int lca(int a,int b)
{if(depth[a] < depth[b]) swap(a,b);for(int k = 16; k >= 0; k --)if(depth[fa[a][k]] >= depth[b])a = fa[a][k];if(a == b) return a;for(int k = 16; k >= 0; k --)if(fa[a][k] != fa[b][k]){a = fa[a][k];b = fa[b][k];}return fa[a][0];
}int dfs(int u,int father,int id)
{int res = d[u];for(int i = h[u]; ~i; i = ne[i]){int j = e[i];if(j == father) continue;int s = dfs(j,u,i);res += s;}if(res == m) ans = max(ans,id / 2 + 1);return res;
}int main()
{ans = -1;cin >> n >> m;memset(h,-1,sizeof h);for(int i = 0; i < n - 1; i ++){int a,b;cin >> a >> b;add(a,b),add(b,a);}bfs();for(int i = 0; i < m; i ++){int a,b;cin >> a >> b;int p = lca(a,b);d[a] ++,d[b] ++,d[p] -= 2;}dfs(1,-1,0);cout << ans << endl;return 0;
}


http://www.ppmy.cn/news/1226555.html

相关文章

计算机毕业设计选题推荐-个人健康微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

springboot jar包 无法读取静态资源文件

springboot jar包 无法读取静态资源文件 参考 springboot项目读取resources目录下的文件的9种方式 Resource resource resourceLoader.getResource("classpath:static/jkbw/jkbw4.txt");try{InputStream inputStream resource.getInputStream();BufferedReader r…

阿里AoneFlow分支管理

分支模式 1.TrunkBased模式 工作方式 TrunkBased 模式是持续集成思想所崇尚的工作方式&#xff0c;它由单个主干分支和许多发布分支组成&#xff0c;每个发布分支在特定版本的提交点上从主干创建出来&#xff0c;用来进行上线部署和 Hotfix&#xff08;补丁&#xff09;。 …

获取虎牙直播源

为了今天得LOL总决赛 然后想着下午看看 但是网页看占用高 就想起来有个直播源 也不复杂看了大概一个小时 没啥问题 进入虎牙页面只有 直接F12 网络 然后 看这个长条 一直在获取 发送 那就选中这个区间 找到都是数字这一条 如果直接访问的话会一直下载 我这都取消了 然后 打开…

【总结】中断处理流程

关中断保存断点&#xff1a;包括PC和PSW&#xff0c;保证中断服务程序执行后可以回到原来的程序中断服务程序寻址 进入中断服务程序 保存现场和屏蔽字&#xff0c;保证原来程序的现场执行信息保留便于在断点处继续执行开中断&#xff08;中断嵌套&#xff09;执行中断服务程序…

聊一聊小程序单聊页面构思

主题界面构建 主题界面构建可以有很多种做法&#xff0c;一种为左右平分式UI设计&#xff0c;简单来说就是对方和我方聊天DOM各占屏幕的一半&#xff0c;完全可以使用flex的布局以及vw构建&#xff0c;一种吧聊天内容作为整体聊天界面的子节点&#xff0c;聊天container内容的高…

【计算机网络笔记】IPv6简介

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

13 Go的错误处理

概述 在上一节的内容中&#xff0c;我们介绍了Go的接口&#xff0c;包括&#xff1a;定义接口、实现接口、使用接口、空接口等。在本节中&#xff0c;我们将介绍Go的错误处理。在Go语言中&#xff0c;错误处理是一种重要的编程模式&#xff0c;它用于处理可能出现的错误或异常情…