不会树剖的我只有去学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的吧!的更多相关文章

  1. 看了xici有写给孩子的信,maybe我也要写给孩子一些东西了

    看了xici有写给孩子的信,maybe我也要写给孩子一些东西了

  2. Java对比两个数据库中的表和字段,写个冷门的东西

    Java对比两个数据库中的表和字段,写个冷门的东西 转载的 来源网络 目前所在的项目组距离下个版本上线已经很近了,就面临了一个问题:开发人员在开发库上根据需要增加数据表.数据字段.或者变更了字段类型或 ...

  3. 51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径

    51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径 题面 n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个区间内各选一点之间的最大距离,即 ...

  4. 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 ...

  5. 这几天对Redis的初探,写一个阶段性的东西

    原来基于wcf写了一个交互框架,其中自定义了一个session队列,用于保存客户端连接的一些信息. 这几天在想如何将这个wcf框架做负载均衡,于是将session队列拆分出来,用一个共享的内存进行处理 ...

  6. jequry_rotate.js用来写旋转类的东西的插件(如:抽奖转盘)

    网上发现一个很有意思的jQuery旋转插件,支持Internet Explorer 6.0+ .Firefox 2.0 .Safari 3 .Opera 9 .Google Chrome,高级浏览器下 ...

  7. easyui 自己写的一些小东西

    1设置combobox,当我们只需要显示一个commbobox的时候,并且默认选择第一项 function Getcombobox(comboId, value, groupNo) { $('#' + ...

  8. 原来你一直写错了?!实力分享一波 CSS 使用的书写规范顺序与偏门又实用的样式...

    我们在埋头写代码的时候,还要学会收集整理一些常用的代码小技巧,以便在工作时候,可以及时调取,提高工作效率. 今天,我把之前收集整理的一些CSS代码小技巧分享出来,供你参考学习,希望对你有帮助. 一.C ...

  9. Count on a tree(SPOJ COT + 树上第k大 + 主席树 + LCA)

    题目链接:https://www.spoj.com/problems/COT/en/ 题目: 题意: 给你一棵有n个节点的树,求节点u到节点v这条链上的第k大. 思路: 我们首先用dfs进行建题目给的 ...

随机推荐

  1. 【Qt开发】【VS开发】VS2010+Qt开发环境搭建

    QT与JAVA有点类似,也是一种跨平台的软件(当然在windows平台和linux平台需要安装相应的QT开发环境和运行库,类似于JAVA在不同平台下的虚拟机JVM环境),因此对于某些需要同时支持win ...

  2. docker安装Rancher

    docker安装Rancher //拉取镜像 docker pull rancher:v2.0.4 //运行容器 docker run -d -p : -p : --restart=always -- ...

  3. java程序启动脚本

    #!/bin/bash appName=`ls|grep .jar$` if [ -z $appName ] then echo "Please check that this script ...

  4. org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents mor

    今天在用junit测试mybits程序是遇到一个问题,报错为: org.apache.ibatis.exceptions.PersistenceException: ### Error queryin ...

  5. MySQL的事务和视图

    事务 1.概念 一条或者多条sql语句的集合! 事务:就是一堆操作的集合,他们同生共死.要么都执行成功,要么都执行失败2.事务的特性  ACID  A:原子性  完整的,不可分割的 原子性 (Atom ...

  6. uboot 主Makefile分析

    一. Makefile 配置 1.1. make xxx_config 1.1.1. 笔者实验时是make x210_sd_config a. x210_sd_config是Makefile下的一个目 ...

  7. MySQL 的自增 ID 用完了,怎么办?

      一.简述 在 MySQL 中用很多类型的自增 ID,每个自增 ID 都设置了初始值.一般情况下初始值都是从 0 开始,然后按照一定的步长增加.在 MySQL 中只要定义了这个数的字节长度,那么就会 ...

  8. RocksDB Rate Limiter源码解析

    这次的项目我们重点关注RocksDB中的一个环节:Rate Limiter.其实Rate Limiter的思想在很多其他系统中也很常用. 在RocksDB中,后台会实时运行compaction和flu ...

  9. javascript xml转json

    1.代码 //加载xml数据 function loadXml(str) { if (str == null) { return null; } var doc = str; try{ doc = c ...

  10. C#设计模式:备忘录模式(Memento Pattern)

    一,C#设计模式:备忘录模式(Memento Pattern) 1.发起人角色(Originator):记录当前时刻的内部状态,负责创建和恢复备忘录数据.负责创建一个备忘录Memento,用以记录当前 ...