不会树剖的我只有去学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. Python基础语法之常量与变量

    一.变量的命名规则 只能以下划线,数字和字母组成,不可以是特殊字符: 不可以以数字开头: 关键字不可作为变量名: 变量名区分大小写: 要具有描述性: 二.常量 python中并没有关键字const,在 ...

  2. 使用Sklearn构建朴素贝叶斯分类器-新闻分类

    # -*- coding: UTF-8 -*- import jieba import os import random from sklearn.naive_bayes import Multino ...

  3. 应用安全 - Web框架 - 数据库管理 - phpMyAdmin - 漏洞汇总

    CVE-2019-18622 Date: 2019.10.28 类型: SQL injection in Designer feature 影响范围: phpMyAdmin versions prio ...

  4. STM32f103软件复位

    参考博客: http://bbs.21ic.com/icview-1251690-1-1.html stm32f103rct 软件复位函数: 在core_cm3.h文件 static __INLINE ...

  5. Centos7 搭建pptp服务器

    1.检查是否支持pptp 返回ok即表示支持 modprobe ppp-compress-18 && echo ok 2.安装ppp yum install -y ppp 3.安装pp ...

  6. POJ 3410 Split convex polygon(凸包)

    题意是逆时针方向给你两个多边形,问你这两个多边形通过旋转和平移能否拼成一个凸包. 首先可以想到的便是枚举边,肯定是有一对长度相同的边贴合,那么我们就可以n2枚举所有边对,接下来就是旋转点对,那么假设多 ...

  7. django字段类型(Field types)介绍

    字段类型(Field types) AutoField 它是一个根据 ID 自增长的 IntegerField 字段.通常,你不必直接使用该字段.如果你没在别的字段上指定主 键,Django 就会自动 ...

  8. mac安装卸载brew

    1.安装 访问https://brew.sh,copy图中的命令到命令行中,进行下载安装 2.卸载 官方版本的卸载: /usr/bin/ruby -e "$(curl -fsSL https ...

  9. 神经网络之:S型神经元

    1.S 型神经元和感知器类似,但是被修改为权重和偏置的微小改动只引起输出的微小变化 2.S型神经元结构: S型函数: 带有x1,x2,........,权重w1,w2.....,和偏置b的S型神经元的 ...

  10. localStorage的使用和vuex的拆分

    问题1:在隐身模式.或者用户未启用的情况下,使用localStorage可能会导致浏览器直接报错,怎么办? 方法:使用try-catch包裹 代码示例: store.jsimport Vue from ...