最近在写一些树上的东西,先发一波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进行建题目给的 ...
随机推荐
- 【Appium遇到的坑】环境配置无误,路径无中文,无空格,提示error: Logcat capture failed: spawn ENOENT
代码如下,提示error: Logcat capture failed: spawn ENOENT from appium import webdriver from time import slee ...
- 红帽学习笔记[RHCSA] 第七课[网络配置相关]
第七课[网络配置相关] 在Vmware中添加网卡 编辑 -> 编辑虚拟网络 -> 添加网络->随便选择一个如VMnet2-> 选择仅主机模式 -> 勾掉使用本地DHCP服 ...
- [转帖]JVM内存结构 VS Java内存模型 VS Java对象模型
JVM内存结构 VS Java内存模型 VS Java对象模型 https://www.hollischuang.com/archives/2509 Java作为一种面向对象的,跨平台语言,其对象.内 ...
- Java——LinkedList使用Demo
package list; import java.util.Iterator; import java.util.LinkedList; public class LinkedListDemo { ...
- vue视图不更新情况详解
vue视图不更新情况详解:https://www.jb51.net/article/161371.htm
- Tarjan水题系列(4):HAOI2010 软件安装
题目: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). ...
- linux下定时器的实现
简介: linux下经常有这样的需求,需要定时轮询执行某种任务,当然,用shell脚本的话,crontab和at就可以满足要求.如果从C语言的角度来看,实现定时器也是一个比较简单的任务,因为具有普遍性 ...
- 算法(C#版)动态规划和贪心算法
https://blog.csdn.net/kouzhuanjing1849/article/details/88954811
- ubuntu install xsltproc docbook-xsl docbook-xml
问题一: $ makexsltproc --output phtml/ param.xsl ./pxml/mainbook.xmlmake: xsltproc: Command not foundma ...
- 方法签名_spring aop_around
//注解签名 方法签名 Signature signature = pjp.getSignature(); MethodSignature methodSignature= (MethodSignat ...