hdu2586 lca倍增法
倍增法加了边的权值,bfs的时候顺便把每个点深度求出来即可
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
#define maxn 40005
#define DEG 20
struct Edge{
int to,next,w;
}edge[maxn*];
int head[maxn],tot;
void addedge(int u,int v,int w){
edge[tot].to=v;
edge[tot].next=head[u];
edge[tot].w=w;
head[u]=tot++;
}
int fa[maxn][DEG];
int deg[maxn],depth[maxn];
int flag[maxn];
void bfs(int root){
queue<int> que;
deg[root]=;depth[root]=;
fa[root][]=root;
que.push(root);
while(!que.empty()){
int tmp=que.front();que.pop();
for(int i=;i<DEG;i++)
fa[tmp][i]=fa[fa[tmp][i-]][i-];
for(int i=head[tmp];i!=-;i=edge[i].next){
int v=edge[i].to;
if(v==fa[tmp][])continue;
deg[v]=deg[tmp]+;
depth[v]=depth[tmp]+edge[i].w;
fa[v][]=tmp;
que.push(v);
}
}
}
int lca(int u,int v){
if(deg[u]>deg[v]) swap(u,v);
int hu=deg[u],hv=deg[v],tu=u,tv=v;
for(int det=hv-hu,i=;det;det>>=,i++)
if(det&) tv=fa[tv][i];
if(tu==tv) return tu;
for(int i=DEG-;i>=;i--){
if(fa[tu][i]==fa[tv][i]) continue;
tu=fa[tu][i];tv=fa[tv][i];
}
return fa[tu][];
}
void init(){
tot=;
memset(flag,,sizeof flag);
memset(head,-,sizeof head);
memset(deg,,sizeof deg);
memset(depth,,sizeof depth);
}
int main(){
int T,n,q,u,v,w;
cin >> T;
while(T--){
init();
scanf("%d%d",&n,&q);
for(int i=;i<n;i++){
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
flag[v]=;
}
int root;
for(int i=;i<=n;i++) if(!flag[i]){root=i;break;}
bfs(root); while(q--){
scanf("%d%d",&u,&v);
int tmp=lca(u,v);
printf("%d\n",depth[u]+depth[v]-*depth[tmp]);
}
}
return ;
}
hdu2586 lca倍增法的更多相关文章
- LCA(最近公共祖先)——LCA倍增法
一.前人种树 博客:最近公共祖先 LCA 倍增法 博客:浅谈倍增法求LCA 二.沙场练兵 题目:POJ 1330 Nearest Common Ancestors 代码: const int MAXN ...
- POJ - 1330 Nearest Common Ancestors(dfs+ST在线算法|LCA倍增法)
1.输入树中的节点数N,输入树中的N-1条边.最后输入2个点,输出它们的最近公共祖先. 2.裸的最近公共祖先. 3. dfs+ST在线算法: /* LCA(POJ 1330) 在线算法 DFS+ST ...
- poj1470 LCA倍增法
倍增法模板题 #include<iostream> #include<cstring> #include<cstdio> #include<queue> ...
- 最近公共祖先 LCA 倍增法
[简介] 解决LCA问题的倍增法是一种基于倍增思想的在线算法. [原理] 原理和同样是使用倍增思想的RMQ-ST 算法类似,比较简单,想清楚后很容易实现. 对于每个节点u , ancestors[u] ...
- luogu3379 【模板】最近公共祖先(LCA) 倍增法
题目大意:给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 整体步骤:1.使两个点深度相同:2.使两个点相同. 这两个步骤都可用倍增法进行优化.定义每个节点的Elder[i]为该节点的2^k( ...
- LCA—倍增法求解
LCA(Least Common Ancestors) 即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先. 常见解法一般有三种 这里讲解一种在线算法-倍增 首先我们定义fa[u][j ...
- LCA - 倍增法去求第几个节点
You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, ...
- POJ 1330(LCA/倍增法模板)
链接:http://poj.org/problem?id=1330 题意:q次询问求两个点u,v的LCA 思路:LCA模板题,首先找一下树的根,然后dfs预处理求LCA(u,v) AC代码: #inc ...
- 【模板】Lca倍增法
Codevs 1036 商务旅行 #include<cstdio> #include<cmath> #include<algorithm> using namesp ...
随机推荐
- (转)Node.js module.exports与exports
本文转自Node.js module.exports与exports 作者: chemdemo 折腾Node.js有些日子了,下面将陆陆续续记录下使用Node.js的一些细节. 熟悉Node.js的童 ...
- mac 上sublime3安装编码插件
我们常常会遇到这样的问题:我们使用 mac 的时候,从 windows 上接受过来的文档通过 sublime3打开之后就是乱码,这个时候需要安装相对应的编码插件才能正常查看. 1. 打开 sublim ...
- 利用Screen重启DevStack服务
上篇介绍了DevStack如何安装部署.集成化工具有好处,但在系统重启后,OpenStack的各个服务并不会随系统重启而启动,需要利用screen来重启,接下来就记录下如何使用screen. 准备工作 ...
- 转 -- 详解python的super()的作用和原理
原文地址 Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this),用于传递对象本身,而在调用的时候则不必显式传递,系统会自动传递. 今天我们介绍的主角是supe ...
- 字典(Dictionary)
字典(Dictionary) 字典是一种可变的容器模型,由键值对组成,键和值用冒号分隔,用花括号括起来: d = {key1 : value1, key2 : value} 字典的值可以是任何类型的数 ...
- Python发邮件的小脚本
# -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText mailto_list = ['hitwh_Gy ...
- iscroll.js 手机上下滑动 加载更多
html <!DOCTYPE html> <html> <head> <title>下拉上拉刷新页面代码</title> <meta ...
- python的安装和pycharm的安装
下载地址 官网:https://www.python.org/downloads/release/python-372/ Window 平台安装 Python: Add python xx to ...
- HDU 2522 A simple problem (模拟)
题目链接 Problem Description Zty很痴迷数学问题..一天,yifenfei出了个数学题想难倒他,让他回答1 / n.但Zty却回答不了^_^. 请大家编程帮助他. Input 第 ...
- python安装模块方法汇总
方法一: 原文地址: http://blog.csdn.net/cighao/article/details/47860041 在 windows 系统下,只需要输入命令 pip install re ...