最近在写一些树上的东西,先发一波LCA的吧!
不会树剖的我只有去学tarjan和倍增了,个人觉得倍增比tarjan好打一点。。。
tarjan学习的地方
http://www.cnblogs.com/JVxie/p/4854719.html
个人写的模板(洛谷的模板题,左右移符号打翻了,挑了好久QAQ)
#include<cstdio>
#include<algorithm>
#define ll long long
#define maxn 500500 << 1
using namespace std; ll head[maxn],head_quest[maxn],tot,n,m,u,v,val,root,f[maxn],ceng[maxn],zou[maxn]; struct st{
ll v,next;
}s[maxn]; struct que{
ll u,v,lca,next;
que *es;
}quest[maxn]; void add(ll u,ll v)
{
tot++;
s[tot].v = v;
s[tot].next = head[u];
head[u] = tot;
} void addquest(ll u,ll v)
{
tot++;
if(tot & ) quest[tot].es = &quest[tot + ];
else quest[tot].es = &quest[tot - ];
quest[tot].u = u;
quest[tot].v = v;
quest[tot].next = head_quest[u];
head_quest[u] = tot;
} ll find(ll x)
{
if(f[x] == x) return x;
f[x] = find(f[x]);
return f[x];
} void dfs(ll fa,ll pos)
{
ceng[pos] = ceng[fa] + ;
for(ll i=head[pos];i;i=s[i].next)
if(s[i].v != fa)
dfs(pos,s[i].v);
} void tarjan(ll fa,ll pos)
{
for(ll i=head[pos];i;i=s[i].next)
{
if(s[i].v == fa) continue;
tarjan(pos,s[i].v);
}
for(ll i=head_quest[pos];i;i=quest[i].next)
{
if(zou[quest[i].v])
{
quest[i].lca = find(quest[i].v);
quest[i].es -> lca = quest[i].lca;
}
}
zou[pos] = ;
f[pos] = fa;
} int main(){
scanf("%lld%lld%lld",&n,&m,&root);
for(ll i=;i<n;i++)
{
scanf("%lld%lld",&u,&v);
add(u,v);
add(v,u);
} dfs(,root); tot = ;
for(ll i=;i<=m;i++)
{
scanf("%lld%lld",&u,&v);
addquest(u,v);
addquest(v,u);
} for(ll i=;i<=n;i++) f[i] = i;
tarjan(,root);
for(ll i=;i<=*m;i+=)
printf("%lld\n",quest[i].lca);
}
接下来是倍增
学习:
http://www.cnblogs.com/FuTaimeng/p/5655616.html
自己写的模板(在洛谷交的时候忘了边要开两倍QAQ)
#include<cstdio>
#include<algorithm>
#include<cmath>
#define maxn 1000500
#define ll long long
using namespace std;
struct st{
ll u,v,next;
}s[maxn];
ll n,m,u,v,root,tot,head[maxn],ceng[maxn],fa[maxn][]; inline void add(ll u,ll v)
{
tot++;
s[tot].u = u;
s[tot].v = v;
s[tot].next = head[u];
head[u] = tot;
} inline void dfs(ll f,ll now)
{
fa[now][] = f;
ceng[now] = ceng[f] + ;
for(ll i = head[now];i;i = s[i].next)
{
if(s[i].v != f)
dfs(now,s[i].v);
}
} inline void init()
{
for(ll j=;(<<j)<=n;j++)
for(ll i=;i<=n;i++)
fa[i][j] = fa[fa[i][j-]][j-];
} inline ll lca(ll a,ll b)
{
if(ceng[a] > ceng[b]) swap(a,b);
ll cha = ceng[b] - ceng[a];
for(ll i = ;( << i) <= cha;i++)
{
if(( << i) & cha) b = fa[b][i];
}
if(a != b)
{
for(ll i=(ll)log2(n);i>=;i--)
{
if(fa[a][i] != fa[b][i])
{
a=fa[a][i];
b=fa[b][i];
}
}
a = fa[a][];
}
return a;
}
int main(){
scanf("%lld%lld%lld",&n,&m,&root);
for(ll i=;i<n;i++)
{
scanf("%lld%lld",&u,&v);
add(u,v);
add(v,u);
} dfs(,root);
init();
for(ll i=;i<=m;i++)
{
scanf("%lld%lld",&u,&v);
printf("%lld\n",lca(u,v));
}
}
最近在写一些树上的东西,先发一波LCA的吧!的更多相关文章
- 看了xici有写给孩子的信,maybe我也要写给孩子一些东西了
看了xici有写给孩子的信,maybe我也要写给孩子一些东西了
- Java对比两个数据库中的表和字段,写个冷门的东西
Java对比两个数据库中的表和字段,写个冷门的东西 转载的 来源网络 目前所在的项目组距离下个版本上线已经很近了,就面临了一个问题:开发人员在开发库上根据需要增加数据表.数据字段.或者变更了字段类型或 ...
- 51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径
51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径 题面 n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个区间内各选一点之间的最大距离,即 ...
- 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 ...
- 这几天对Redis的初探,写一个阶段性的东西
原来基于wcf写了一个交互框架,其中自定义了一个session队列,用于保存客户端连接的一些信息. 这几天在想如何将这个wcf框架做负载均衡,于是将session队列拆分出来,用一个共享的内存进行处理 ...
- jequry_rotate.js用来写旋转类的东西的插件(如:抽奖转盘)
网上发现一个很有意思的jQuery旋转插件,支持Internet Explorer 6.0+ .Firefox 2.0 .Safari 3 .Opera 9 .Google Chrome,高级浏览器下 ...
- easyui 自己写的一些小东西
1设置combobox,当我们只需要显示一个commbobox的时候,并且默认选择第一项 function Getcombobox(comboId, value, groupNo) { $('#' + ...
- 原来你一直写错了?!实力分享一波 CSS 使用的书写规范顺序与偏门又实用的样式...
我们在埋头写代码的时候,还要学会收集整理一些常用的代码小技巧,以便在工作时候,可以及时调取,提高工作效率. 今天,我把之前收集整理的一些CSS代码小技巧分享出来,供你参考学习,希望对你有帮助. 一.C ...
- Count on a tree(SPOJ COT + 树上第k大 + 主席树 + LCA)
题目链接:https://www.spoj.com/problems/COT/en/ 题目: 题意: 给你一棵有n个节点的树,求节点u到节点v这条链上的第k大. 思路: 我们首先用dfs进行建题目给的 ...
随机推荐
- python每日一练:0011题
第 0011 题: 敏感词文本文件 filtered_words.txt,里面的内容为以下内容,当用户输入敏感词语时,则打印出 Freedom,否则打印出 Human Rights. 北京 程序员 公 ...
- 简述Vue项目中返回上一页
1.背景 由于Vue所生成的项目叫做单页应用,即SPA,如果还是使用jQuery中的go(-)或back()是行不通的,所以,我们使用到了Vue中的编程式导航. 2.基本使用 定义返回按钮: < ...
- 深入理解java:2.1. volatile的使用及其原理
引言 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”. 可见性的意思是 ...
- JavaScript Return Object.Type
var getType = function(obj) { if (obj == null) { return String(obj); } return typeof obj === 'object ...
- [Vim] 01 凡人操作
历史评价 编辑器之神 一个凡人的自我修养 成神是不可能成神的,只能是先入个门,然后一点一点学 Vim 官网 三种模式 插入模式(注意看光标) 命令模式(注意看光标) 编辑模式(注意看光标) 其实还有一 ...
- steps 步骤条、时间轴
steps 步骤条.时间轴:http://www.fxss5201.cn/project/plugin/steps/1.0/ Github地址:https://github.com/fxss5201/ ...
- C/C++ 内存与指针
内存与指针杂谈 1.指针 1.数组指针 int(*ptr)[n] ()的优先级高,(*ptr)表示ptr是一个指针,指向一个int类型的一维数组,这个数组的长度为n,也可以说ptr的步长就是n.也就是 ...
- Vue组件化和路由
组件化 组件化是vue的核心思想,它能提高开发效率,方便重复使用,简化调试步骤,提升整个项目的可维护性,便于多人协同开发 组件通信 父组件 => 子组件: 属性props 特性$attrs 引用 ...
- webdriver 的使用 java 和python 两个版本
在使用webdriver前要先做下准备,1.下载相应的支持包,可以pom.xml文件引入 2.下载版本对应的浏览器驱动(我这里用的是chromedriver.exe),很多问题都是由于浏览器驱动引起的 ...
- mysql的innodb 引擎 表锁与行锁
innodb 引擎 行锁与表锁 行锁与表锁是基于索引来说的(且索引要生效) 不带索引 (表锁)要全表扫描 1. 执行select @@autocommit; 查看结果 0是不自动提交事务,1是自动提交 ...