Hdu 2586 树链剖分求LCA
Code:
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=40000+3;
typedef long long ll;
ll dis[maxn];
int son[maxn],siz[maxn],rank1[maxn],p[maxn],top[maxn];
struct Edge {
int from, to, dis;
Edge(int from, int to, int dis) :from(from), to(to), dis(dis){}
};
struct LCA{
vector<Edge>edges;
vector<int>G[maxn];
void init(int n){
for(int i=1;i<=n;++i)G[i].clear();
edges.clear();
memset(son,-1,sizeof(son));memset(dis,0,sizeof(dis));
memset(rank1,0,sizeof(rank1));memset(p,0,sizeof(p));
memset(siz,0,sizeof(siz));memset(top,0,sizeof(top));
}
void add_edge(int from,int to,int dis){
edges.push_back(Edge(from,to,dis));
int m=edges.size()-1;
G[from].push_back(m);
}
void dfs1(int u,int fa,int cur,ll dep)
{
siz[u]=1,p[u]=fa,rank1[u]=cur;
dis[u]=dep;
for(int i=0;i<G[u].size();++i)
{
int m=G[u][i];
Edge E=edges[m];
if(E.to!=fa)
{
dfs1(E.to,u,cur+1,dep+E.dis);
siz[u]+=siz[E.to];
if(son[u]==-1||siz[son[u]]<siz[E.to])son[u]=E.to;
}
}
}
void dfs2(int u,int tp){
top[u]=tp;
if(son[u]!=-1)dfs2(son[u],tp);
for(int i=0;i<G[u].size();++i)
{
int m=G[u][i];
Edge E=edges[m];
if(E.to!=p[u]&&E.to!=son[u])dfs2(E.to,E.to);
}
}
int query(int x,int y)
{
while(top[x]!=top[y])
{
if(rank1[top[x]]<=rank1[top[y]])y=p[top[y]];
else x=p[top[x]];
}
if(rank1[x]<=rank1[y])return x;
return y;
}
ll ans(int x,int y)
{
ll m1=dis[x],m2=dis[y];
int lca=query(x,y);
return m1+m2-2*dis[lca];
}
};
int main(){
int T;scanf("%d",&T);
while(T--)
{
int n,m;scanf("%d%d",&n,&m);
LCA _lca;
_lca.init(n);
for(int i=1;i<n;++i)
{
int from,to,dis;
scanf("%d%d%d",&from,&to,&dis);
_lca.add_edge(from,to,dis);
_lca.add_edge(to,from,dis);
}
_lca.dfs1(1,-1,1,0);
_lca.dfs2(1,1);
for(int i=1;i<=m;++i)
{
int a,b;scanf("%d%d",&a,&b);
printf("%lld\n",_lca.ans(a,b));
}
}
return 0;
}
Hdu 2586 树链剖分求LCA的更多相关文章
- 树链剖分求LCA
树链剖分中各种数组的作用: siz[]数组,用来保存以x为根的子树节点个数 top[]数组,用来保存当前节点的所在链的顶端节点 son[]数组,用来保存重儿子 dep[]数组,用来保存当前节点的深度 ...
- cogs 2450. 距离 树链剖分求LCA最近公共祖先 快速求树上两点距离 详细讲解 带注释!
2450. 距离 ★★ 输入文件:distance.in 输出文件:distance.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 在一个村子里有N个房子,一 ...
- cogs 2109. [NOIP 2015] 运输计划 提高组Day2T3 树链剖分求LCA 二分答案 差分
2109. [NOIP 2015] 运输计划 ★★★☆ 输入文件:transport.in 输出文件:transport.out 简单对比时间限制:3 s 内存限制:256 MB [题 ...
- HDU2586 How far away ? (树链剖分求LCA)
用树链剖分求LCA的模板: 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const ...
- 【树链剖分】洛谷P3379 树链剖分求LCA
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 【POJ1330】Nearest Common Ancestors(树链剖分求LCA)
Description A rooted tree is a well-known data structure in computer science and engineering. An exa ...
- 【模板】树链剖分求LCA
洛谷3379 #include<cstdio> #include<algorithm> using namespace std; ,inf=1e9; int n,m,x,y,r ...
- hdu 5274 树链剖分
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- hdu 5893 (树链剖分+合并)
List wants to travel Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/O ...
随机推荐
- SSH 项目中 用Hibernate底层 简单的封装DAO层
废话不多少了,主要是使用hibernate的查询方法,自己封装了DAO层,供service来方便使用. 首先:必须要继承的 public class CommonDao extends Hiberna ...
- 无意中发现destoon5商城处理订单时的一些bug
最新的destoon5在商城的商品中加入了商品属性的功能,可以使用三个商品属性 而在代码中用如“49-3-0-0”来标记所选择的的商品及属性,其中第一个数字是商品的id,后三个表示的是商品对应的属性值 ...
- idea的项目中output框出现乱码
找到tomcat的安装目录中的logging.properties 我的在这里:E:\tools\tomcat\apache-tomcat-8.5.38\conf 改其中的参数 修改前 java.u ...
- 01《UML大战需求分析》阅读笔记之一
在大二的时候就已经在课堂上对UML也就是统一建模语言有了初步的了解,但是却不怎么明白,虽然可以画图可以完成任务,但是有些糊里糊涂.所以特地把这门书作为精读书籍,想要更加深度地学习UML.很多内容只用语 ...
- servlet缺省路径
servlet缺省路径 servlet的缺省路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个路径.该路径对应的是一个Defaul ...
- Eclipse中切换GIT分支
切换GIT分支: 右击项目——Team——Switch To——选择你要切换的分支.
- JSP获取json格式的数据报错 Uncaught SyntaxError: Unexpected identifier
后台json字符串是 {"id":"cmdb_ci.`fully_qualified_domain_name`","field":" ...
- layui select change
<select lay-filter="test"></select> layui.use([ 'form'], function() { var form ...
- Unity图集分割
using System.IO;using UnityEngine;using UnityEditor; public class TestSaveSprite{ [MenuItem("LL ...
- Linux 操作系统启动流程
1.加载bios bios中包含的硬件CPU 内存 硬盘等相关信息 2.读取MBR 读取完bios信息之后,计算机会查找bios制定的硬盘MBR引导扇区,将其内容复制到 0x7c00 地址所在的物理内 ...