树讲解——紧急集合(lca)
大视野 1787: [Ahoi2008]Meet 紧急集合
Time Limit: 20 Sec Memory Limit: 162 MB
Submit: 3067 Solved: 1365
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2
2 3
2 4
4 5
5 6
4 5 6
6 3 1
2 4 4
6 6 6
Sample Output
5 2
2 5
4 1
6 0
HINT
Source
Day1
思路:
看到这个题我们可以很快的分析出这道题是求三点的每两点的最小公共祖先,然后再求这三个点的最小公共祖先。然而,这样显然是很麻烦的,所以我们来看看有什么简便的方法。通过观察我们可以发现这样一个问题:这三个点两两间的lca至少有两个是相同的。
如果有两个相同的lca,那集合地点就是在lca与另一点的lca处,若三个lca均相同,那集合地点一定是该点的lca了!
是不是感觉很简单,来上代码!
代码:
#include<vector> #include<stdio.h> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define N 500001 using namespace std; vector<int>vec[N]; int fa[N],top[N],size[N],n,m,x,y,z,ans,t,deep[N]; inline int read() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}return x*f; } int lca(int x,int y) {while(top[x]!=top[y]){if(deep[x]<deep[y])swap(x,y);x=fa[top[x]]; }if(deep[x]>deep[y])swap(x,y);return x; } int dfs(int x) {size[x]=1;deep[x]=deep[fa[x]]+1;for(int i=0;i<vec[x].size();i++)if(vec[x][i]!=fa[x]){fa[vec[x][i]]=x;dfs(vec[x][i]);size[x]+=size[vec[x][i]];} } int dfs1(int x) {int t=0;if(!top[x]) top[x]=x;for(int i=0;i<vec[x].size();i++)if(fa[x]!=vec[x][i]&&size[vec[x][i]]>size[x])t=vec[x][i];if(t)top[t]=top[x],dfs1(t);for(int i=0;i<vec[x].size();i++)if(fa[x]!=vec[x][i]&&vec[x][i]!=t)dfs1(vec[x][i]); } int main() {n=read(),m=read();for(int i=1;i<n;i++){x=read();y=read();vec[x].push_back(y);vec[y].push_back(x);}dfs(1);dfs1(1);for(int i=1;i<=m;i++){x=read();y=read();z=read();t=lca(x,y)^lca(x,z)^lca(y,z);ans=deep[x]+deep[t]-2*deep[lca(x,t)];ans+=deep[y]+deep[t]-2*deep[lca(y,t)];ans+=deep[z]+deep[t]-2*deep[lca(z,t)];printf("%d %d\n",t,ans);}return 0; }
转载于:https://www.cnblogs.com/z360/p/6833025.html
树讲解——紧急集合(lca)相关推荐
- ros中设置Global Options,以及rqt_tf_tree树讲解,TF树的理解,使用GUI插件,用于可视化ROS-TF的框架树
一.设置Global Options 如图30,启动rviz界面后,首先要对Global Options进行设置,Global Options里面的参数是一些全局显示相关的参数.其中的Fixed Fr ...
- 超级详细树讲解三 —— B树、B+树图解+代码
首先很高兴你看到了这篇文章,这篇文章可能会花费你很长很长的时间去看,但是这篇文章包括的内容绝对足够你对树的一个系统性的学习.为什么要写这篇文字呢?因为自己在学习树的时候,有些博客只有图解,有些博客只有 ...
- BZOJ 1787 [Ahoi2008]Meet 紧急集合——LCA
1787: [Ahoi2008]Meet 紧急集合 题目传送门 解题思路 本题是裸的LCA,特殊就在是三个点的LCA,然而并没有什么关系. 三个节点两两求LCA,将会有两个一样的公共祖先,剩下的一个就 ...
- 【BZOJ2819】Nim 树状数组+LCA
[BZOJ2819]Nim Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可 ...
- 初级线段树讲解---转
转载关于线段树的讲解 好久没写过算法了,添一个吧,写一个线段树的入门知识,比较大众化. 上次在湖大,其中的一道题数据很强,我试了好多种优化都TLE,相信只能用线段树才能过.回来之后暗暗又学了一次线段树 ...
- [虚树][树状数组][lca] Jzoj P5908 开荒
Description 题目背景: 尊者神高达作为一个萌新,在升级路上死亡无数次后被一只大黄叽带回了师门.他加入师门后发现有无穷无尽的师兄弟姐妹,这几天新副本开了,尊者神高达的师门作为一个 pve师门 ...
- [SDOI2013]森林(树上主席树+启发式合并+lca)
链接:https://ac.nowcoder.com/acm/problem/20577 来源:牛客网 题目描述 小Z有一片森林,含有N个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有 ...
- Distance on the tree(树上倍增+主席树+树上差分+lca)南昌网络赛
题目链接:南昌邀请赛网络赛Distance on the tree 统计一条链上边权小于k的边数. 树上差分,对于边权来说,一条链上的边的条数=sum[x]+sum[y]-2*sum[lca(x,y) ...
- BZOJ1787 [Ahoi2008]Meet 紧急集合 LCA
欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1787 题意概括 有一棵节点为n个(n≤500000)的树.接下来m次询问(m≤500000),每次 ...
最新文章
- entity、model和domain三者区别
- vue json 导出 excel
- html5基础知识点字体属性
- xampp mysql 备份_Linux Xampp计划任务自动备份Mysql数据库和所有网站
- asp.net返回值当文件下载问题
- git/ssh捋不清的几个问题
- 用CSS美化你的滚动条
- 梯度下降法快速教程 | 第一章:Python简易实现以及对学习率的探讨
- es聚合查询与多维度数据统计
- python多进程间通信_Python 多进程编程之 进程间的通信(Queue)
- Eclipse用法和技巧十四:自动生成的TODO注释2
- python执行shell脚本、执行mongodb_mongodb如何执行js
- Java-static概述
- LeetCode----两数之和
- 四方支付系统,聚合平台搭建
- c语言读取gps模块数据类型,GPS数据读取与处理(一)之GPS模块的数据格式
- Python批量处理lrmx格式文档内指定内容
- 击穿线程池面试题:3大方法,7大参数,4种拒绝策略
- 华为荣耀屏鸿蒙,荣耀智慧屏:华为鸿蒙迈出的第一步
- WIN10隐藏任务栏和桌面图标(简易实现)
热门文章
- xxl-job 定时任务简单使用
- int型数据类型为什么取值范围是-2^31~2^31-1
- IMEISV码转换成IMEI码
- android 获取 imei号码
- 商品国标码的SQLSERVER SQL 校验位 实现:
- 三菱fx2n做从站的modbus通讯_三菱Q系列和FX2N系列进行CCLink通讯(主站和智能设备站的通讯)...
- qq分享和空间分享弹出对话框或Popu…
- 判断两个链表是否交叉,并求出交叉点
- python错误:SyntaxError: Non-UTF-8 code starting with ‘\xbd‘
- AT91SAM9261开发板SBC6000X(转)