2019-11-07 09:25:45

C.树之呼吸-叁之型-树上两点路径长度
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 7 (4 users) Total Accepted: 2 (2 users) Special Judge: No
Description

给一棵 n 个结点的树,结点编号从 1 到 n,并指定 m 号结点为根;

给出 q 个询问,每次询问从编号为 x 的结点到编号为 y 的结点的路径长度。

Input

输入第一行为一个正整数 T,表示测试数据组数;

对于每组测试数据,输入第一行为三个正整数 n、m、q,表示树的结点数,根结点的编号以及询问数;

接下来 n - 1 行给出树的结构,每行两个正整数 x、y,表示结点 x 与结点 y 有边相连;

接下来 q 行给出询问,每行两个正整数 x、y,表示询问从结点 x 到结点 y 的路径长度;

1 <= T <= 20,1 <= n,q <= 1e5,1 <= m <= n。

Output

每组测试数据的第一行输出“Case #i:”(不含引号),表示是第 i 组测试数据;

接下来 q 行,每行输出一个整数,表示给出的两结点间的路径长路。

Sample Input
2
5 2 3
1 4
5 4
2 4
3 2
1 3
5 2
4 1
3 1 2
1 2
1 3
1 1
2 3
Sample Output
Case #1:
3
2
1
Case #2:
0
2
Author
陈鑫

最近公共祖先LCA模板题,

ans=deep[x]-deep[LCA(x,y)]+deep[y]-deep[LCA(x,y)];

 #include<bits/stdc++.h>
using namespace std;
const int amn=2e5+;
vector<int> eg[amn];
int n,m,maxh,deep[amn],anc[amn][]; ///maxh为树的最大深度=(int)log2(n)+1,deep为结点的深度,anc为距离结点x路径长度为2^i的结点是哪个
queue<int> q; void bfs(int rt){
q.push(rt);deep[rt]=;
while(q.size()){
int u=q.front();q.pop();
for(int i=;i<eg[u].size();i++){
int v=eg[u][i];
if(deep[v])continue;
deep[v]=deep[u]+; ///深度
anc[v][]=u;
for(int j=;j<=maxh;j++) anc[v][j]=anc[anc[v][j-]][j-]; ///预处理2^k距离
q.push(v);
}
}
}
int Lca(int x,int y){
if(deep[x]<deep[y])swap(x,y); ///我们规定x的深度要比y的深度大,所有若x的深度比y的深度小则要将他们交换
for(int i=maxh;i>=;i--) if(deep[anc[x][i]]>=deep[y])x=anc[x][i]; ///将x和y移到同一深度,为什么是>=,因为anc[x][i]表示距离x结点2^i路径长度的结点时哪个,如果时anc[x][0]则表示距离x结点路径长度为1的结点
if(x==y)return x; ///如果x==y说明y是他们的LCA,现在x==y了,可以任意返回x或y,这里你返回y也行
for(int i=maxh;i>=;i--) if(anc[x][i]!=anc[y][i]){x=anc[x][i];y=anc[y][i];} ///找x和y的LCA
return anc[x][]; ///输出LCA
}
void init(int rt){
memset(deep,,sizeof deep);
memset(anc,,sizeof anc);
maxh=(int)log2(n)+;
bfs(rt);
}
int main(){
int T,Case=,an,x,y,q;scanf("%d",&T);
while(T--){
for(int i=;i<=n;i++)eg[i].clear(); ///用vector存边要加这句
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<n;i++){
scanf("%d%d",&x,&y);
eg[x].push_back(y);
eg[y].push_back(x);
}
init(m);
printf("Case #%d:\n",Case++);
while(q--){
scanf("%d%d",&x,&y);
an=Lca(x,y);
printf("%d\n",deep[x]+deep[y]-*deep[an]); ///(deep[x]-deep[an])+(deep[y]-deep[an]),x到最近公共祖先的深度+y到最近公共祖先的深度
}
}
}
/**
题意: 给一棵 n 个结点的树,结点编号从 1 到 n,并指定 m 号结点为根;
给出 q 个询问,每次询问从编号为 x 的结点到编号为 y 的结点的路径长度。
思路:求出x和y的最近公共祖先,答案是x到最近公共祖先的深度+y到最近公共祖先的深度
**/

[模板] LCA-最近公共祖先-倍增法的更多相关文章

  1. LCA最近公共祖先---倍增法笔记

    先暂时把模板写出来,A几道题再来补充 此模板也是洛谷上的一道模板题 P3379 [模板]最近公共祖先(LCA) #pragma GCC optimize(2) //o2优化 #include < ...

  2. LCA (最近公共祖先)倍增做法 —— O(nlogn)预处理 O(logn)(在线)查询

    pa[a][j] 表示 a 结点的 2^j倍祖先(j = 0时 为直接父亲,j = 1时为父亲的父亲……) 1.首先预处理出所有结点的深度值dep和父亲结点 void dfs(int u, int f ...

  3. 洛谷P3379 【模板】最近公共祖先(LCA)(dfs序+倍增)

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

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

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

  5. [总结]最近公共祖先(倍增求LCA)

    目录 一.定义 二.LCA的实现流程 1. 预处理 2. 计算LCA 三.例题 例1:P3379 [模板]最近公共祖先(LCA) 四.树上差分 1. 边差分 2. 点差分 3. 例题 一.定义 给定一 ...

  6. 最近公共祖先(LCA)学习笔记 | P3379 【模板】最近公共祖先(LCA)题解

    研究了LCA,写篇笔记记录一下. 讲解使用例题 P3379 [模板]最近公共祖先(LCA). 什么是LCA 最近公共祖先简称 LCA(Lowest Common Ancestor).两个节点的最近公共 ...

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

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

  8. 「LuoguP3379」 【模板】最近公共祖先(LCA)

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

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

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

随机推荐

  1. Android入门(创建、编译、运行、打包、安装)

    一.创建Android项目 1.选择Emtpy Activity=>Next 2.配置项目 输入Name(名称) Package.name(包名) Save location(保存位置) Lan ...

  2. C++走向远洋——(项目二、存储班长信息的学生类、派生)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  3. 一行python代码搞定文件分享

    给同事分享文件,如你所知通过聊天工具,网盘或linux命令各种方法,还有一个也可以尝试下:使用一行python代码快速搭建一个http服务器在局域网内进行下载. python3使用: python3 ...

  4. Roma - Facebook工具链大一统

    什么是roma roma,中文名罗马,是Facebook的rn团队的产出,是一个试验性质的javascript工具链,集编译,linter,格式化,打包,测试等等于一体.目标是成为一个处理javasc ...

  5. XXE学习(二)——DTD基础

    一.DTD简介 文档类型定义(DTD)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档的结构. 有了DTD文档后,xml就需按照DTD中的规范来书写 DTD 可被成行地声明于 XML ...

  6. 7-43 jmu-python-字符串异常处理 (20 分)

    输入一行字符串及下标,能取出相应字符.程序能对不合法数据做相应异常处理. 输入格式: 行1:输入一字符串 行2:输入字符下标 输出格式: 下标非数值异常,输出下标要整数 下标越界,输出下标越界 数据正 ...

  7. MVC06

    1.校验机制 我们可以在Model中使用属性进行校验 using System; using System.ComponentModel.DataAnnotations; using System.D ...

  8. PHPRAP v1.0.6 发布,修复因php7.1版本遗弃mcrypt扩展造成安装失败的BUG

    PHPRAP,是一个PHP轻量级开源API接口文档管理系统,致力于减少前后端沟通成本,提高团队协作开发效率,打造PHP版的RAP. 更新记录 [修复]修复因php7.1版本遗弃mcrypt扩展造成安装 ...

  9. 使用D3.js构建实时图形

    首先你需要在计算机上安装Node和npm. 数据的可视化表示是传递复杂信息的最有效手段之一,D3.js提供了创建这些数据可视化的强大工具和灵活性. D3.js是一个JavaScript库,用于使用SV ...

  10. 安装mysql.so

    1.----   cd /usr/local/src/php-5.5.34/ext/mysql/2.----  /usr/local/php5/bin/phpize3.---- ./configure ...