传送门

题意:

  某村庄有n个小屋,n-1条道路连接着n个小屋(无环),求村庄A到村庄B的距离,要求是经过任一村庄不超过一次。

题解:

  求出 lca = LCA(u,v) , 然后答案便是dist[u] + dist[v] - 2 * dist[lca];

AC代码:

 #include<iostream>
#include<vector>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define pb(x) push_back(x)
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn=4e4+; int n,q;
int dist[maxn];//dist[i]: 节点i与节点1的距离,假定1为根节点
int vs[*maxn];//欧拉序列
int depth[*maxn];//深度序列
int pos[maxn];//pos[i]:节点i在欧拉序列中第一次出现的位置
bool vis[maxn];
struct Edge
{
int to;
int w;
Edge(int a=,int b=):to(a),w(b){}
};
vector<Edge >G[maxn];
void addEdge(int u,int v,int w)
{
G[u].pb(Edge(v,w));
}
struct RMQ
{
int dp[][*maxn];
void rmq()
{
int tot=*n-;
for(int i=;i <= tot;++i)
dp[][i]=i;
for(int k=;(<<k) <= tot;++k)
for(int i=;((<<k)+i-) <= tot;++i)
if(depth[dp[k-][i]] > depth[dp[k-][i+(<<(k-))]])
dp[k][i]=dp[k-][i+(<<(k-))];
else
dp[k][i]=dp[k-][i];
}
int lca(int u,int v)
{
u=pos[u],v=pos[v];
if(u > v)
swap(u,v);
int k=log(v-u+)/log();
return vs[min(dp[k][u],dp[k][v-(<<k)+])];
}
}_rmq;
void Dfs(int u,int dis,int dep,int &k)
{
vs[++k]=u;
depth[k]=dep;
pos[u]=k;
dist[u]=dis;
vis[u]=true;
for(int i=;i < G[u].size();++i)
{
int to=G[u][i].to;
int w=G[u][i].w;
if(!vis[to])
{
Dfs(to,dis+w,dep+,k);
vs[++k]=u;
depth[k]=dep;
}
}
}
void LCA()
{
int k=;
Dfs(,,,k);
_rmq.rmq();
}
void Init()
{
mem(vis,false);
for(int i=;i <= n;++i)
G[i].clear();
}
int main()
{
// freopen("C:/Users/hyacinthLJP/Desktop/stdin/hdu2586.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
Init();
scanf("%d%d",&n,&q);
for(int i=;i < n;++i)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addEdge(u,v,w);
addEdge(v,u,w);
}
LCA();
for(int i=;i <= q;++i)
{
int u,v;
scanf("%d%d",&u,&v);
int lca=_rmq.lca(u,v);
printf("%d\n",dist[u]+dist[v]-*dist[lca]);
}
}
return ;
}

基于RMQ的LCA

hdu 2586(裸LCA)的更多相关文章

  1. How far away ? HDU - 2586 【LCA】【RMQ】【java】

    题目大意:求树上任意两点距离. 思路: dis[i]表示i到根的距离(手动选根),则u.v的距离=dis[u]+dis[v]-2*dis[lca(u,v)]. lca:u~v的dfs序列区间里,深度最 ...

  2. hdu 2874(裸LCA)

    传送门:Problem 2874 https://www.cnblogs.com/violet-acmer/p/9686774.html 改了一晚上bug,悲伤辣么大,明天再补详细题解 题解: 题目中 ...

  3. 【HDU 2586】LCA模板

    在一棵树上 求2个点的最短距离.那么首先利用LCA找到2个点的近期公共祖先 公式:ans = dis(x) + dis(y) - 2 * dis(lca(x,y)) 这里的dis(x)指的上x距离根节 ...

  4. HDU 2586(LCA欧拉序和st表)

    什么是欧拉序,可以去这个大佬的博客(https://www.cnblogs.com/stxy-ferryman/p/7741970.html)巨详细 因为欧拉序中的两点之间,就是两点遍历的过程,所以只 ...

  5. HDU - 2586 How far away ?(LCA模板题)

    HDU - 2586 How far away ? Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & ...

  6. hdu 2586 How far away ?倍增LCA

    hdu 2586 How far away ?倍增LCA 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2586 思路: 针对询问次数多的时候,采取倍增 ...

  7. LCA(最近公共祖先)--tarjan离线算法 hdu 2586

    HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  8. HDU 2586 (LCA模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题目大意:在一个无向树上,求一条链权和. 解题思路: 0 | 1 /   \ 2      3 ...

  9. HDU 2586 How far away ? (LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 LCA模版题. RMQ+LCA: #include <iostream> #incl ...

随机推荐

  1. rsync同步时,删除目标目录比源目录多余文件的方法(--delete)

    在日常运维工作中,我们经常用到rsync这个同步神器.有时在同步两个目录时,会要求删除目标目录中比源目录多出的文件,这种情况下,就可用到rsync的--delete参数来实现这个需求了. 实例说明:在 ...

  2. 牛客训练赛25-A-因数个数

    题目链接https://www.nowcoder.com/acm/contest/158/A 无语...这题很迷啊,原谅我的菜,刚开始想用预处理欧拉筛和前缀和,可是这题太血崩了,这样一样要遍历,1-e ...

  3. D. Mysterious Crime

    链接 [http://codeforces.com/contest/1043/problem/D] 题意 给你一个m*n的矩阵(m<=10,n<=1e5), 每一行的数字是1到n里不同的数 ...

  4. 去掉ambiguous expansion of macro警告

    查看原文:http://www.heyuan110.com/?p=1221 用pod install后,pod工程里出现ambiguous expansion of macro的warning,对于有 ...

  5. The MathType Dll cannot be found 问题解决办法

    被这个问题困扰了许久,找到了解决办法,没想到最后居然是因为mathtype安装路径里的文件位置有问题(至少我是这么认为的).是这样的,在安装完mathtype6.9b后,发现打开word2013是正常 ...

  6. Use curl with uuid(uuidgen) under shell

    #!set uuidtmp = uuid.tmp #!uuidgen > $uuidtmp #!set uuid=<$uuidtmp #!rm $uuidtmp #!echo $uuid ...

  7. jQuery empty() vs remove()

    https://stackoverflow.com/questions/3090662/jquery-empty-vs-remove http://www.cnblogs.com/yeer/archi ...

  8. java程序在windows系统作为服务程序运行

    Java程序很多情况下是作为服务程序运行的,在Un*x 平台下可以利用在命令后加“&”把程序作为后台服务运行,但在Windows下看作那个Console窗口在桌面上,你是否一直担心别的同时把你 ...

  9. P2157 [SDOI2009]学校食堂

    题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数 ...

  10. SpringBoot基础入门

    1.SpringBoot核心相关内容 1.1入口类 SpringBoot通常有一个入口类*Application,内部有一个main方法,是启动SpringBoot的入口.使用@SpringBootA ...