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(离线)算法的基本思路及其算法实现
首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点. 换句话说,就是两个点在这棵 ...
随机推荐
- 从 A/Looper: Could not create epoll instance. errno=24 错误浅谈解决各种 bug 的思路
今天代码写着写着就莫名闪退了,手机也没有“程序停止运行”的提示,logcat也没有看到蓝色的调用栈log,这样的闪退最是蛋疼了,还好必现.复现几次之后,终于从logcat中看到了一行可疑的log: A ...
- 11.用C对32位内存地址的访问方式
使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义 #define RAM_ADDR (*(volatile unsigned long *)0x0000555F) ...
- AKKA(一)认知AKKA
Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用.它已经成功运用在电信行业.系统几乎不会宕机(高可用性 99.999999 ...
- Eclipse中web项目部署至Tomcat【转】
Eclipse的web工程至Tomcat默认的部署目录是在工程空间下,本文旨在将部署目录改为Tomcat安装目录,并解决依赖包输出问题. 1.在Eclipse中添加Tomcat服务器. 2.将web ...
- C#绘制传感器代码
//以下代码添加到任一窗口下即可 private int 旋转角度 = 0; private int 边长 = 10; protected override ...
- Vagrant的一个BUG - 不支持'change_host_name'
==> master: Setting hostname... Vagrant attempted to execute the capability 'change_host_name' on ...
- C# iis 错误配置信息( CS0016: 未能写入输出文件 )
IIS发布时,编译器错误消息: CS0016: 未能写入输出文件 "c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.N ...
- MySQL事件 Events
MySQL事件 Events 一.关键字: EVENT 二.语法: CREATE EVENT? [IF NOT EXISTS ] //如果不存在则创建 event_name? ON SCHED ...
- iOS强制屏幕旋转
/** 强制旋转屏幕为纵向 (注:这种方式 键盘不能旋转过来; iOS8.x下 UIAlterView旋转不过来 ) @return */ + (void)rotateOrientationPort ...
- Getting Started
https://developers.google.com/v8/get_started Getting Started This document introduces some key V8 co ...