树讲解——紧急集合(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
2 5
4 1
6 0
HINT
Source
思路:
看到这个题我们可以很快的分析出这道题是求三点的每两点的最小公共祖先,然后再求这三个点的最小公共祖先。然而,这样显然是很麻烦的,所以我们来看看有什么简便的方法。通过观察我们可以发现这样一个问题:这三个点两两间的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()
- {
- ,f=;
- char ch=getchar();
- ')
- {
- ;
- ch=getchar();
- }
- ')
- {
- x=x*+ch-';
- 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]=;
- deep[x]=deep[fa[x]]+;
- ;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)
- {
- ;
- if(!top[x]) top[x]=x;
- ;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);
- ;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();
- ;i<n;i++)
- {
- x=read();
- y=read();
- vec[x].push_back(y);
- vec[y].push_back(x);
- }
- dfs();
- dfs1();
- ;i<=m;i++)
- {
- x=read();y=read();z=read();
- t=lca(x,y)^lca(x,z)^lca(y,z);
- ans=deep[x]+deep[t]-*deep[lca(x,t)];
- ans+=deep[y]+deep[t]-*deep[lca(y,t)];
- ans+=deep[z]+deep[t]-*deep[lca(z,t)];
- printf("%d %d\n",t,ans);
- }
- ;
- }
树讲解——紧急集合(lca)的更多相关文章
- SPOJ 10628 COT - Count on a tree(在树上建立主席树)(LCA)
COT - Count on a tree #tree You are given a tree with N nodes.The tree nodes are numbered from 1 to ...
- C# 表达式树讲解(一)
一.前言 一直想写一篇Dpper的定制化扩展的文章,但是里面会设计到对Lambda表达式的解析,而解析Lambda表达式,就必须要知道表达式树的相关知识点.我希望能通过对各个模块的知识点或者运用能够多 ...
- Bzoj 2588 Spoj 10628. Count on a tree(树链剖分LCA+主席树)
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MB Description 给定一棵N个节点的树,每个点 ...
- 树讲解——牧场行走( lca )
大视野 1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1947 Solved: 1021[Sub ...
- 【块状树】【LCA】bzoj1787 [Ahoi2008]Meet 紧急集合
分块LCA什么的,意外地快呢…… 就是对询问的3个点两两求LCA,若其中两组LCA相等,则答案为第三者. 然后用深度减一减什么的就求出距离了. #include<cstdio> #incl ...
- bzoj 1787: [Ahoi2008]Meet 紧急集合【树链剖分lca】
对于三个点求最小路径长度和,答案肯定在某两个点的lca上,因为如果把集合点定在公共lca上,一定有两个点汇合后再一起上到lca,这样显然不如让剩下的那个点下来 这个lca可能是深度最深的--但是我懒得 ...
- 【BZOJ-4082】Surveillance 树链剖分 LCA + 贪心
4082: [Wf2014]Surveillance Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 260 Solved: 100[Submit][ ...
- HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...
- HDU4836 The Query on the Tree(树状数组&&LCA)
由于智力的问题,百度之星完全lu不动..开场看第一题根据题目给的条件我觉得一定是可以构造出来的,题目给的意思颇有鸽巢原理的感觉,于是觉得开场第一题应该就是智力构造题了,想了半个小时,发现完全想不动,于 ...
随机推荐
- Thinkphp 5 调试执行的SQL语句
在模型操作中 ,为了更好的查明错误,经常需要查看下最近使用的SQL语句,我们可以用getLastsql方法来输出上次执行的sql语句.例如: User::get(1); echo User::getL ...
- JQuery 在线编辑器和手册
JQuery 在线编辑器 JQuery 在线编辑器 JQuery 菜鸟教程 手册 JQuery 菜鸟教程 手册
- 2015多校训练第二场 hdu5305
把这题想复杂了,一直在考虑怎么快速的判断将选的边和已选的边无冲突,后来经人提醒发现这根本没必要,反正数据也不大开两个数组爆搜就OK了,搜索之前要先排除两种没必要搜的情况,这很容易想到,爆搜的时候注意几 ...
- 写iOS SDK注意事项
转载http://www.devtang.com/blog/2015/01/31/write-sdk-tips/
- [每日App一]QQ主题要逆天!轻轻松松月入30万!
听从吾师秦刚(微信或QQ:1111884)酋长的建议,谋哥(微信viyi88)我开始新的征程,每日更新一篇干货文章(要坚持啊!否则被酋长鄙视了). 好了,废话不多说,今天我给大家揭秘一个你从来想也木有 ...
- python随机数的产生
导入 random模块 >>> import random 1. random.random random.random()用于生成一个0到1的随机浮点数: 0 <= n ...
- ccna学习指南第七版
1.加电post自检 闪存查找ios 可随时从命令行进入设置模式,为此可在特权模式下输入setup ctrl+c退出特权模式 6.2cli 命令行界面 进入cli router> ...
- 1.ABP使用boilerplate模版创建解决方案
1.到ABP框架的官网(http://www.aspnetboilerplate.com/),自动生成一个解决方案 每步注解: 第一步:AngularJS是一款比较火的SPA(Single Page ...
- Invalid regular expression flags 错误
找到写正则表达式的地方,检查是不是写了一个非法的正则表达式. Invalid regular expression flags
- 《分布式对象存储》作者手把手教你写 GO 语言单元测试!
第一部分:如何写Go语言单元测试 Go语言内建了单元测试(Unit Test)框架.这是为了从语言层面规范写UT的方式. Go语言的命名规则会将以_test.go结尾的go文件视作单元测试代码. 当我 ...