【luogu P3379 最近公共祖先】 模板
题目链接:https://www.luogu.org/problemnew/show/P3379
倍增求lca,先存下板子,留个坑以后再填讲解。
in
5 5 4
3 1
2 4
5 1
1 4
2 4
3 2
3 5
1 2
4 5
out
4
4
1
4
4
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxlog = ;
const int maxn = ;
int n, m, s;
int root;
int fa[maxn][maxlog];
int deep[maxn];
int head[maxn];
int cnt;
struct Edge{
int next;
int to;
}e[ * maxn];
void add(int u, int v)
{
e[cnt].to = v;
e[cnt].next = head[u];
head[u] = cnt++;
}
void dfs(int u, int p, int d)
{
fa[u][] = p;
deep[u] = d;
for(int i = head[u]; i != -; i = e[i].next)
if(e[i].to != p) dfs(e[i].to, u, d+);
}
void init()
{
dfs (root, -, );
for(int k = ; k + < maxlog; k++)
{
for(int v = ; v <= n; v++)
if(fa[v][k] < ) fa[v][k+] = -;
else fa[v][k+] = fa[fa[v][k]][k];
}
}
int lca(int u, int v)
{
if(deep[u] > deep[v]) swap(u, v);
for(int k = ; k < maxlog; k++)
{
if((deep[v] - deep[u]) >> k & )
v = fa[v][k];
}
if(u == v) return u;
for(int k = maxlog - ; k >= ; k--)
{
if(fa[v][k] != fa[u][k])
{
u = fa[u][k];
v = fa[v][k];
}
}
return fa[u][];
}
int main()
{
memset(head,-,sizeof(head));
int a,b;
scanf("%d%d%d",&n,&m,&root);
for(int i = ; i < n; i++)
{
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
init();
for(int i = ; i <= m; i++)
{
int u,v,a;
scanf("%d%d",&u,&v);
a = lca(u,v);
printf("%d\n",a);
}
return ;
}
/*
in:
9 5 1
1 2
1 3
2 5
2 4
3 6
7 9
6 7
6 8
9 8
9 5
6 5
4 3
4 5
out:
6
1
1
1
2
*/
【luogu P3379 最近公共祖先】 模板的更多相关文章
- P3379 最近公共祖先(LCA) 洛谷
题意简单明了(这就是个模板). 就是让我们找2个节点的公共祖先而已,但我们要讲的做法不是生硬的爆搜,而且直接搜好像过不去…… 这次就讲我往后拖了n多天才开始学了倍增LCA. 嗯,这个题,如果2个节点的 ...
- LCA(最近公共祖先)模板
Tarjan版本 /* gyt Live up to every day */ #pragma comment(linker,"/STACK:1024000000,1024000000&qu ...
- LCA最近公共祖先模板(求树上任意两个节点的最短距离 || 求两个点的路进(有且只有唯一的一条))
原理可以参考大神 LCA_Tarjan (离线) TarjanTarjan 算法求 LCA 的时间复杂度为 O(n+q) ,是一种离线算法,要用到并查集.(注:这里的复杂度其实应该不是 O(n+q) ...
- P3379最近公共祖先(LCA)
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- LCA最近公共祖先模板代码
vector模拟邻接表: #include<iostream> #include<cstdio> #include<cstring> #include<cma ...
- lca最短公共祖先模板(hdu2586)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 #include<iostream> #include<cstdio> ...
- LCA(最近公共祖先)之倍增算法
概述 对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. 如图,3和5的最近公共祖先是1,5和2的最近公共祖先是4 在本篇中我们先介 ...
- 【原创】洛谷 LUOGU P3379 【模板】最近公共祖先(LCA) -> 倍增
P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...
- 洛谷P3379 【模板】最近公共祖先(LCA)
P3379 [模板]最近公共祖先(LCA) 152通过 532提交 题目提供者HansBug 标签 难度普及+/提高 提交 讨论 题解 最新讨论 为什么还是超时.... 倍增怎么70!!题解好像有 ...
随机推荐
- 安装wine
sudo add-apt-repository ppa:ubuntu-wine/ppa sudo apt-get update sudo apt-get install winetricks
- Java实现Ip代理池
设置Ip代理很多时候都会有用到,尤其是在写爬虫相关项目的时候.虽然自己目前没有接触这种需求,但由于最近比较闲,就写着当作练习吧 爬取代理IP 爬取 关于爬取代理IP,国内首先想到的网站当然是 西刺代理 ...
- MYSQL系列-MYSQL基础增强(Myql函数)
MYSQL基础增强(Myql函数) 在这里只介绍一些常用的,比较新颖的: 字符串函数: CONCAT://字符串连接函数 mysql> SELECT CONCAT('My', 'S', 'QL' ...
- JavaScript对象 创建对象(一)
创建对象 --以下内容来自JavaScript高级程序设计 工厂模式 用函数来封装以特定接口创建对象的细节. function createPerson(name, age, job){ var o ...
- node.js之forEach
forEach用法: var array1=[1,2,3]; array1.forEach(function(item,index){ console.log(item+'---'+index); } ...
- vs文件属性(生成操作)各选项功能
右击项目里的文件,选择属性(F4)会有[生成操作]的选项. 它提供了14项选择,如图: 在这说一下常用的选项: 1.编译 编译用于c#代码类的操作,编译之后输出在该程序集的bin目录下.换句话说,代码 ...
- DataRow获取数值类型为空或NULL时异常处理
//获取数据集内容 DataSet ContractDS = dal.GetJHFKStr(jhfubh); //验证数据集是否为空 if (!DataSetUtil.IsNullOrEmpty(Co ...
- webpack起步
为什么要使用webpack 很牛逼的样子 https://www.webpackjs.com/comparison/ 基本概念 1. 入口(entry) module.exports = { entr ...
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...
- matlab练习程序(Hilbert图像置乱)
正好刚写了Hibert生成曲线,不如再加一篇应用的程序. 关于Hilbert图像置乱,我在网上搜的应用领域主要集中在数字水印和图像加密上,而这两个领域我都没怎么接触过. 大部分的图像置乱都是如下图的置 ...