最近在写一些树上的东西,先发一波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进行建题目给的 ...
随机推荐
- 【Qt开发】【VS开发】VS2010+Qt开发环境搭建
QT与JAVA有点类似,也是一种跨平台的软件(当然在windows平台和linux平台需要安装相应的QT开发环境和运行库,类似于JAVA在不同平台下的虚拟机JVM环境),因此对于某些需要同时支持win ...
- docker安装Rancher
docker安装Rancher //拉取镜像 docker pull rancher:v2.0.4 //运行容器 docker run -d -p : -p : --restart=always -- ...
- java程序启动脚本
#!/bin/bash appName=`ls|grep .jar$` if [ -z $appName ] then echo "Please check that this script ...
- 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 ...
- MySQL的事务和视图
事务 1.概念 一条或者多条sql语句的集合! 事务:就是一堆操作的集合,他们同生共死.要么都执行成功,要么都执行失败2.事务的特性 ACID A:原子性 完整的,不可分割的 原子性 (Atom ...
- uboot 主Makefile分析
一. Makefile 配置 1.1. make xxx_config 1.1.1. 笔者实验时是make x210_sd_config a. x210_sd_config是Makefile下的一个目 ...
- MySQL 的自增 ID 用完了,怎么办?
一.简述 在 MySQL 中用很多类型的自增 ID,每个自增 ID 都设置了初始值.一般情况下初始值都是从 0 开始,然后按照一定的步长增加.在 MySQL 中只要定义了这个数的字节长度,那么就会 ...
- RocksDB Rate Limiter源码解析
这次的项目我们重点关注RocksDB中的一个环节:Rate Limiter.其实Rate Limiter的思想在很多其他系统中也很常用. 在RocksDB中,后台会实时运行compaction和flu ...
- javascript xml转json
1.代码 //加载xml数据 function loadXml(str) { if (str == null) { return null; } var doc = str; try{ doc = c ...
- C#设计模式:备忘录模式(Memento Pattern)
一,C#设计模式:备忘录模式(Memento Pattern) 1.发起人角色(Originator):记录当前时刻的内部状态,负责创建和恢复备忘录数据.负责创建一个备忘录Memento,用以记录当前 ...