POJ 1330 Nearest Common Ancestors (模板题)【LCA】
<题目链接>
题目大意:
给出一棵树,问任意两个点的最近公共祖先的编号。
解题分析:
LCA模板题,下面用的是树上倍增求解。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
;
const int INF = 0x3f3f3f3f;
struct Edge{
int to, next;
}edge[N<<];
int n,cnt, head[N], in[N];
];
void add_edge(int v, int u){
edge[cnt].to = u, edge[cnt].next = head[v], head[v] = cnt++;
}
void dfs(int u, int fa){ //得到所有节点的深度
; i = edge[i].next){
int v = edge[i].to;
if(v == fa) continue;
if(!dep[v]){
dep[v] = dep[u] + ;
f[v][] = u;
dfs(v, u);
}
}
}
void init(){ //树上倍增预处理
; (<<j) <= n; j++)
; i <= n; i++)
f[i][j] = f[f[i][j-]][j-];
}
int LCA(int v, int u){
if(dep[v] < dep[u])swap(v, u); //v为深度更深的节点
int d = dep[v] - dep[u];
; (d>>i) != ; i++)
) v = f[v][i]; //以上的操作是处理较深的节点,使两节点深度一致
if(v == u) return v; //如果深度一致时,两节点相同,那么直接返回即可
;i>= ;i--)
if(f[v][i] != f[u][i]) //跳2^i步不一样,就跳,否则不跳
v = f[v][i],u = f[u][i]; //两点一起向上跳2^i步
]; //经证明,上述操作做完,两点的LCA都在上一层,所以再走一步即可
}
int main(){
int t, a, b;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
cnt = ;
memset(head, -, sizeof head);
memset(, sizeof in);
; i < n; i++){
scanf("%d%d", &a, &b);
add_edge(a, b);
in[b]++;
}
memset(dep, , sizeof dep);
int root;
; i <= n; i++)
if(!in[i]) root = i;
dep[root] = ;
dfs(root, -);
init(); //注意这里init要放在dfs后面,因为f[i][0]需要通过dfs预处理得到
scanf("%d%d", &a, &b);
printf("%d\n", LCA(a, b));
}
;
}
2018-10-18
POJ 1330 Nearest Common Ancestors (模板题)【LCA】的更多相关文章
- POJ - 1330 Nearest Common Ancestors(基础LCA)
POJ - 1330 Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %l ...
- poj 1330 Nearest Common Ancestors 单次LCA/DFS
Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19919 Accept ...
- POJ 1330 Nearest Common Ancestors(裸LCA)
Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39596 Accept ...
- POJ 1330 Nearest Common Ancestors(Tarjan离线LCA)
Description A rooted tree is a well-known data structure in computer science and engineering. An exa ...
- poj 1330 Nearest Common Ancestors 裸的LCA
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #i ...
- POJ.1330 Nearest Common Ancestors (LCA 倍增)
POJ.1330 Nearest Common Ancestors (LCA 倍增) 题意分析 给出一棵树,树上有n个点(n-1)条边,n-1个父子的边的关系a-b.接下来给出xy,求出xy的lca节 ...
- POJ 1330 Nearest Common Ancestors(lca)
POJ 1330 Nearest Common Ancestors A rooted tree is a well-known data structure in computer science a ...
- POJ 1330 Nearest Common Ancestors 倍增算法的LCA
POJ 1330 Nearest Common Ancestors 题意:最近公共祖先的裸题 思路:LCA和ST我们已经很熟悉了,但是这里的f[i][j]却有相似却又不同的含义.f[i][j]表示i节 ...
- POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA)
POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA) Description A ...
随机推荐
- HTML中特殊符号的处理
一.写在前面 今天在写页面时记不清大/小于符号该怎么写,于是就想着整理一下方便后面用到! 二.HTML中常用特殊符号的处理 < < 小于号或显示标记 > ...
- java-pdf转word
注:原文来至 < java-pdf转word > 一: java Pdf 文字 转 Word 废话不说,直接上图 很简单的用法:1.new个PDFBox对象2.调用pdfToDoc() ...
- Confluence 6 管理协同编辑 - 最大编辑者的限制
我们限制为最多 12 个用户可以同时对一个页面进行编辑.这个意味着当一个页面已经有 12 个用户正在编辑了,13 个用户是不能进入编辑界面的,直到 12 个用户中有一个用户已经离开了. 系统管理员可以 ...
- django 之知识点总结以及Form组件
一.model常用操作 1.13个API查询:all,filter,get ,values,values_list,distinct,order_by ,reverse , exclude(排除),c ...
- Microsoft Graph 概述
这个系列文章 已经进行到了实质的阶段,继上一篇介绍了如何搭建Office 365开发环境之后,我会通过这篇文章给大家介绍一个非常重要的概念:Microsoft Graph.它之所以重要,首先是因为它是 ...
- PDF裁剪页面,PDF怎么裁剪页面的方法
PDF文件要怎么裁剪页面呢,是不是有很多的小伙们想知道呢,当打开一个PDF文件的时候如果一个页面中有很多的空白页面就会影响文件的美观与使用,今天小编就为大家分享一下小编的裁剪页面的方法. 操作软件:迅 ...
- java实现 排序算法(鸡尾酒排序&选择排序&插入排序&二分插入排序)
1.鸡尾酒排序算法 源程序代码: package com.SuanFa; public class Cocktial { public static void main(String[] arg ...
- java----static关键字(包括final)
static修饰字段: 使用static关键字修饰一个字段:声明的static变量实际上就是一个全局变量 使用static关键字修饰一个方法:可以直接使用类调用方法,和对象没有关系了 使用static ...
- DIY电源拓扑线
记一些小事. 一.材料及工具:电源座DC-005.热熔胶.废弃PCB.锡线.导线.电烙铁.热风枪(或打火机.热熔胶枪) 二.使用热熔胶将电源座粘在一起.两个电源座之间垫一块废弃的PCB,防止两者距离过 ...
- Jenkins构建后发送邮件
我们首先安装Jenkins邮件扩展插件“ Email Extension Plugin ”. Jenkins和插件的安装方法见上一篇文章:http://qicheng0211.blog.51cto.c ...