[蓝桥杯]真题讲解:砍树(DFS遍历、图的存储、树上差分与LCA)

[蓝桥杯]真题讲解:砍树(DFS遍历、图的存储、树上差分与LCA

  • 一、视频讲解
  • 二、暴力代码
  • 三、正解代码

一、视频讲解

视频讲解
在这里插入图片描述

二、暴力代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;typedef pair<int,int> pii;vector<int>edge[N];int n, m;int w[N];//从每一个边的边权。map<pii, int>id;//存边的编号//s是路径的起点,v是路径的重终点,u表示你当前走到了哪个点。
bool dfs(int s, int u, int father, int v)
{if(u == v){return true;}for(int i = 0; i < edge[u].size(); i ++){int son = edge[u][i];if(son == father)continue;if(dfs(s, son, u, v)){int ID = id[{u, son}];w[ID] ++;return true;}}return false;
}void solve()
{cin >> n >> m;for(int i = 0; i < n - 1; i ++){int x, y; cin >> x >> y;edge[x].push_back(y);edge[y].push_back(x);id[{x, y}] = id[{y, x}] = i;}for(int i = 0; i < m; i ++){int x, y; cin >> x >> y;dfs(x, x, -1, y);}int ans = -1;for(int i = n - 1; i >= 0; i --){if(w[i] == m){ans = i + 1;break;}}cout << ans << endl;
}signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t = 1;// cin >> t;while(t--)solve();
}

三、正解代码

//砍树:树上差分 + 最近公共祖先
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
const int N = 1e5 + 10;
int n, m;
int w[N];//记录每个点的点权。map<pii,int>id;
vector<int>edge[N];int siz[N], dep[N], fa[N], son[N], top[N];void dfs1(int u, int father)
{siz[u] = 1, dep[u] = dep[father] + 1;fa[u] = father;for(int i = 0; i < edge[u].size(); i ++){int s = edge[u][i];if(s == fa[u])continue;dfs1(s, u);siz[u] += siz[s];if(siz[son[u]] < siz[s])son[u] = s;}
}void dfs2(int u, int t)
{top[u] = t;if(son[u] == 0)return;dfs2(son[u], t);for(int i = 0; i < edge[u].size(); i ++){int s = edge[u][i];if(s == fa[u] || s == son[u])continue;dfs2(s, s);}
}int lca(int x, int y)
{while(top[x] != top[y]){if(dep[top[x]] < dep[top[y]])swap(x, y);x = fa[top[x]];}return dep[x] < dep[y] ? x : y;
}void cal_sum(int u, int father)
{for(int i = 0; i < edge[u].size(); i ++){int son = edge[u][i];if(son == father)continue;cal_sum(son, u);w[u] += w[son];}
}void solve()
{cin >> n >> m;for(int i = 1; i <= n - 1; i ++){int x, y; cin >> x >> y;edge[x].push_back(y);edge[y].push_back(x);id[{x, y}] = i;id[{y, x}] = i;}	dfs1(1, 0);dfs2(1, 1);for(int i = 0; i < m; i ++){int a, b; cin >> a >> b;//做树上差分w[a] ++, w[b] ++;w[lca(a, b)] -= 2;}cal_sum(1, 0);int ans = -1;for(int i = 1; i <= n; i ++){if(w[i] == m){int ID = id[{i, fa[i]}];ans = max(ans, ID);}}cout << ans << endl;
}signed main()
{ios::sync_with_stdio(0);cin.tie(0);int t = 1;// cin >> t;while(t--)solve();
}

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

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

相关文章

Gitlab-runner注册与配置

文章目录 概要操作流程获取HTTPS证书上传证书修改gitlab-runner dns配置文件gitlab-runner 注册 概要 本文主要介绍了Gitlab-runner在内网环境注册到gitlab的操作方式。内网环境如下&#xff1a; 1、gitlab-runner由docker镜像部署&#xff1b; 2、gitlab部署与内网&#xff0…

数据中心的规划设计初探

阅读<<IT基础架构&#xff1a;系统运维实践>>节选 如何避免变化打乱规划 因为需求的不确定性&#xff0c;需求变更是不可避免的&#xff0c;那么提前预判并采取积极有效的应对措施就显得十分重要了 资源预留不能闭门造车&#xff0c;必须和业务方进行充分沟通&a…

云手机的数据安全有保障吗?

随着移动互联网的迅速发展&#xff0c;云手机作为一种新兴的移动终端技术&#xff0c;正在逐渐受到人们的关注和应用。然而&#xff0c;对于云手机而言&#xff0c;数据安全问题一直是人们关注的焦点之一。本文将探讨云手机的数据安全性&#xff0c;并分析其是否具备足够的保障…

[ 云计算 | AWS ] ChatGPT 竞争对手 Claude 3 上线亚马逊云,实测表现超预期

文章目录 一、前言二、Claude 3 介绍以及相关测试细节三、在亚马逊云科技上体验 Claude 33.1 在 Amazon Bedrock 服务中配置 Claude 33.2 为聊天配置使用 Claude 3 模型3.3 Caude 3 Sonet 聊天体验 四、文末总结五、参考文献 一、前言 3月4号&#xff0c;Anthropic 发布了号称…

深入解析:在 Node.js 中删除文件的正确姿势

引言 在 Node.js 中处理文件尤其是移除文件&#xff0c;对于维护高效应用程序至关重要。储存和秩序当道的今天&#xff0c;删除不必要或冗余的文件能力显得尤为关键。本文深入探讨你会想要使用这个强大功能的时刻和原因&#xff0c;并通过各种案例展示了这个概念&#xff0c;同…

HTTP 工作流程请求响应 - 面试常问

文章目录 HTTP 工作流程请求和响应格式HTTP请求格式请求行&#xff1a;请求头部字段&#xff1a;空行&#xff1a;消息正文&#xff08;请求正文&#xff09;&#xff1a; HTTP响应格式状态行&#xff1a;响应头部字段&#xff1a;空行&#xff1a; HTTP方法HTTP状态码常用HTTP…

强缓存和协商缓存

前言 计算机网络模型从底到上&#xff1a;物理层&#xff08;光纤、网线&#xff09;、链路层&#xff08;MAC地址&#xff09;、网络层&#xff08;IP协议&#xff09;、传输层&#xff08;TCP\UDP&#xff09;、应用层&#xff08;HTTP\FTP\DNS&#xff09;。HTTP协议是作用…

Midjourney绘图欣赏系列(十三)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

机器学习——终身学习

终身学习 AI不断学习新的任务&#xff0c;最终进化成天网控制人类终身学习&#xff08;LLL&#xff09;&#xff0c;持续学习&#xff0c;永不停止的学习&#xff0c;增量学习 用线上收集的资料不断的训练模型 问题就是对之前的任务进行遗忘&#xff0c;在之前的任务上表现不好…

Java学习五—数组

一、关于数组 1.1简介 在Java中&#xff0c;数组是一种特殊的对象&#xff0c;用于存储固定大小的相同类型的元素。数组可以存储基本数据类型&#xff08;如int、char、boolean等&#xff09;或对象引用。 ​ 1.2背景 我们可以想一个问题&#xff0c;如果现在让你存储100个…

openKylin系统安装ssh服务结合内网穿透实现固定公网地址访问

文章目录 1. 安装SSH服务2. 本地SSH连接测试3. openKylin安装Cpolar4. 配置 SSH公网地址5. 公网远程SSH连接小结 6. 固定SSH公网地址7. SSH固定地址连接 openKylin是中国首个基于Linux 的桌面操作系统开发者平台&#xff0c;通过开放操作系统源代码的方式&#xff0c;打造具有自…

VR历史建筑漫游介绍|虚拟现实体验店加盟|VR设备购买

VR历史建筑漫游是一种利用虚拟现实技术&#xff0c;让用户可以身临其境地参观和探索历史建筑的体验。通过VR头显和相关设备&#xff0c;用户可以在虚拟环境中自由移动和互动&#xff0c;感受历史建筑的真实氛围和文化内涵。 在VR历史建筑漫游中&#xff0c;您可以选择不同的历史…