hdu 2586 How far away ?(离线求最近公共祖先)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<cmath>
#include<map>
using namespace std; const int mx=4e4+;
struct N
{
int v,d;
N(int x,int y)
{
v=x;
d=y;
}
};
vector<N>g[mx],q[mx];
int father[mx];
int dis[mx];
bool vs[mx];
int ans[mx]; void Init(int n)
{
for (int i=;i<=n;i++)
{
father[i]=i;
dis[i]=;
vs[i]=false;
g[i].clear();
q[i].clear();
}
} int Find(int x)
{
int w=x;
while (w!=father[w]) w=father[w];
while (x!=father[x])
{
int fa=father[x];
father[x]=w;
x=fa;
}
return w;
} void un(int x,int y)
{
int rx=Find(x);
int ry=Find(y);
father[y]=x;
} void dfs(int u,int fa,int d)
{
dis[u]=d;
vs[u]=true;
for (int i=;i<g[u].size();i++)
{
N k=g[u][i];
if (vs[k.v]) continue;
dfs(k.v,u,d+k.d);
}
for (int i=;i<q[u].size();i++)
{
N k=q[u][i];
if (!vs[k.v]) continue;
ans[k.d]=dis[u]+dis[k.v]-*dis[Find(k.v)];
}
un(fa,u);
} int main()
{
int n,m;
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
Init(n);
for (int i=;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
g[u].push_back(N(v,w));
g[v].push_back(N(u,w));
}
for (int i=;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
q[u].push_back(N(v,i));
q[v].push_back(N(u,i));
}
dfs(,,);
for (int i=;i<=m;i++) printf("%d\n",ans[i]);
}
}
hdu 2586 How far away ?(离线求最近公共祖先)的更多相关文章
- 【LCA求最近公共祖先+vector构图】Distance Queries
Distance Queries 时间限制: 1 Sec 内存限制: 128 MB 题目描述 约翰的奶牛们拒绝跑他的马拉松,因为她们悠闲的生活不能承受他选择的长长的赛道.因此他决心找一条更合理的赛道 ...
- POJ 1986 Distance Queries (Tarjan算法求最近公共祖先)
题目链接 Description Farmer John's cows refused to run in his marathon since he chose a path much too lo ...
- 求最近公共祖先(LCA)的各种算法
水一发题解. 我只是想存一下树剖LCA的代码...... 以洛谷上的这个模板为例:P3379 [模板]最近公共祖先(LCA) 1.朴素LCA 就像做模拟题一样,先dfs找到基本信息:每个节点的父亲.深 ...
- tarjan算法求最近公共祖先
tarjian算法 LCA: LCA(Least Common Ancestor),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点.也就是说,在两个点通往根的道路上,肯定会有公共的节点,我们 ...
- 用“倍增法”求最近公共祖先(LCA)
1.最近公共祖先:对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.的祖先且x的深度尽可能大. 2.朴素算法:记录下每个节点的父亲,使节点u,v一步一步地向上找 ...
- LCA 在线倍增法 求最近公共祖先
第一步:建树 这个就不说了 第二部:分为两步 分别是深度预处理和祖先DP预处理 DP预处理: int i,j; ;(<<j)<n;j++) ;i<n;++i) ) fa[i ...
- hdu 2586 欧拉序+rmq 求lca
题意:求树上任意两点的距离 先说下欧拉序 对这颗树来说 欧拉序为 ABDBEGBACFHFCA 那欧拉序有啥用 这里先说第一个作用 求lca 对于一个欧拉序列,我们要求的两个点在欧拉序中的第一个位置之 ...
- hdu 2586 How far away ? ( 离线 LCA , tarjan )
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现
首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点. 换句话说,就是两个点在这棵 ...
随机推荐
- C#中操作Word(1)—— word对象模型介绍
一.开发环境布置 C#中添加对Word的支持,只需添加对Microsoft.Office.Interop.Word的命名空间,如下图所示,右键点击“引用”,在弹出的“添加引用”对话框中选中COM标签页 ...
- AngularJS-chapter1-2-四大特性
4大特性 MVC MVC实例 数据模型,控制器,视图 HelloAngular_MVC.html 图中的 ng-controller="HelloAngular" 定义了Hel ...
- JS面向对象的程序设计
面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...
- UITableView的创建及其一些常用方法
UITableView,它的数据源继承于UITableViewDataSource,它的委托UITableViewDelegate. 一.UITableView的创建 1.代码方式: UITableV ...
- Rasterizer Stage(读书笔记3 --- Real-Time rendering)
rasterizer stage的目标:计算和设置每个像素的颜色.将屏幕空间的二维顶点和每个顶点的shading信息转换为屏幕上的像素. rasterizer stage可以分为几个阶段:triang ...
- 在js中怎么样选择互斥的相邻元素
在使用jquery中,我们通常会选择siblings()去选择相邻元素,使用eq()方法去匹配元素,使用index()获取对应元素的索引值,具体jquery代码如下: <style> *{ ...
- 26. linux查看端口占用情况
linux系统下,查看端口占用情况的命令:lsof -i[root@www ~]# lsof -i
- over partition by与group by 的区别
(本文摘自scottpei的博客) over partition by与group by 的区别 今天看到一个老兄的问题, 大概如下: 查询出部门的最低工资的userid 号 表结构: D号 ...
- app 支付宝 支付 alipaySdk
function pay(P1: JString; P2: Boolean): JString; cdecl; function fetchOrderInfoFromH5PayUrl(P1: J ...
- linux 目录下文件批量植入和删除,按日期打包
linux目录下文件批量植入 [root@greymouster http2]# find /usr/local/http2/htdocs/ -type f|xargs sed -i " ...