题目链接: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 最近公共祖先】 模板的更多相关文章

  1. P3379 最近公共祖先(LCA) 洛谷

    题意简单明了(这就是个模板). 就是让我们找2个节点的公共祖先而已,但我们要讲的做法不是生硬的爆搜,而且直接搜好像过不去…… 这次就讲我往后拖了n多天才开始学了倍增LCA. 嗯,这个题,如果2个节点的 ...

  2. LCA(最近公共祖先)模板

    Tarjan版本 /* gyt Live up to every day */ #pragma comment(linker,"/STACK:1024000000,1024000000&qu ...

  3. LCA最近公共祖先模板(求树上任意两个节点的最短距离 || 求两个点的路进(有且只有唯一的一条))

    原理可以参考大神 LCA_Tarjan (离线) TarjanTarjan 算法求 LCA 的时间复杂度为 O(n+q) ,是一种离线算法,要用到并查集.(注:这里的复杂度其实应该不是 O(n+q)  ...

  4. P3379最近公共祖先(LCA)

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  5. LCA最近公共祖先模板代码

    vector模拟邻接表: #include<iostream> #include<cstdio> #include<cstring> #include<cma ...

  6. lca最短公共祖先模板(hdu2586)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 #include<iostream> #include<cstdio> ...

  7. LCA(最近公共祖先)之倍增算法

    概述 对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. 如图,3和5的最近公共祖先是1,5和2的最近公共祖先是4 在本篇中我们先介 ...

  8. 【原创】洛谷 LUOGU P3379 【模板】最近公共祖先(LCA) -> 倍增

    P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...

  9. 洛谷P3379 【模板】最近公共祖先(LCA)

    P3379 [模板]最近公共祖先(LCA) 152通过 532提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 为什么还是超时.... 倍增怎么70!!题解好像有 ...

随机推荐

  1. Spark on Yarn运行错误:Yarn application has already ended! It might have been killed or unable to launch application master

    Spark on Yarn模式运行错误: bin/spark-shell --master yarn --deploy-mode client #报错 ​ 查看8088页面上的工作日志 错误原因:在执 ...

  2. pat00-自测1. 打印沙漏(20)

    00-自测1. 打印沙漏(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求你写个程序把给定的符号打 ...

  3. 微信小程序支付c#后台实现

    今天为大家带来比较简单的支付后台处理 首先下载官方的c#模板(WxPayAPI),将模板(WxPayAPI)添加到服务器上,然后在WxPayAPI项目目录中添加两个“一般处理程序” (改名为GetOp ...

  4. c#-FrameWork02泛型

    泛型 l  泛型(generic)编程是一种编程范式,它利用”参数化类型”将类型抽象化,从而可以实现更为灵活的复用.把数据类型参数化 sh泛型集合 泛型集合与集合的对比 泛型集合类 非泛型集合类 Li ...

  5. js Base64与字符串互转

    1.base64加密 在页面中引入base64.js文件,调用方法为: <!DOCTYPE HTML> <html> <head> <meta charset ...

  6. poi学习

    需要节点  <dependency>  <groupId>org.apache.poi</groupId>  <artifactId>poi</a ...

  7. Android 使用RecyclerView优雅实现悬浮标题通讯录

    项目地址:https://github.com/hgDendi/ContactsList 界面概览: ContactsListDemo ContactsListDemo2 概要 如图,主要简单划分为两 ...

  8. GridCellChoiceEditor

    choice_editor = wx.grid.GridCellChoiceEditor(choices_list, True) grid.SetCellEditor(row, col, choice ...

  9. 用Webstorm 运行React-native 工程时,出错:xcrun: error: unable to find utility "instruments", not a developer tool or in PATH

    解决方法:在 终端执行如下命令 sudo xcode-select -s /Applications/Xcode.app/Contents/Developer/ 注意:前提是你已经安装了xcode

  10. 控制台执行java找不到或无法加载主类