hdu 2586(裸LCA)
题意:
某村庄有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)的更多相关文章
- 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序列区间里,深度最 ...
- hdu 2874(裸LCA)
传送门:Problem 2874 https://www.cnblogs.com/violet-acmer/p/9686774.html 改了一晚上bug,悲伤辣么大,明天再补详细题解 题解: 题目中 ...
- 【HDU 2586】LCA模板
在一棵树上 求2个点的最短距离.那么首先利用LCA找到2个点的近期公共祖先 公式:ans = dis(x) + dis(y) - 2 * dis(lca(x,y)) 这里的dis(x)指的上x距离根节 ...
- HDU 2586(LCA欧拉序和st表)
什么是欧拉序,可以去这个大佬的博客(https://www.cnblogs.com/stxy-ferryman/p/7741970.html)巨详细 因为欧拉序中的两点之间,就是两点遍历的过程,所以只 ...
- HDU - 2586 How far away ?(LCA模板题)
HDU - 2586 How far away ? Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & ...
- hdu 2586 How far away ?倍增LCA
hdu 2586 How far away ?倍增LCA 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2586 思路: 针对询问次数多的时候,采取倍增 ...
- LCA(最近公共祖先)--tarjan离线算法 hdu 2586
HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- HDU 2586 (LCA模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题目大意:在一个无向树上,求一条链权和. 解题思路: 0 | 1 / \ 2 3 ...
- HDU 2586 How far away ? (LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 LCA模版题. RMQ+LCA: #include <iostream> #incl ...
随机推荐
- 剑指offer:二叉树中和为某一值的路径
本来这只是一个普通的算法题,但是当初自己OJ上提交时,总是提交失败,而我自己认定程序逻辑没有任何问题.然后开始就在本机上调试,结果发现这是由于Python的对象机制而引发的.所以先把问题算法题贴出来, ...
- spatial-temporal information extraction典型方法总结
==================================== 咳咳咳 由于科研的直接对象就是video sequence,所以,如何更好地提取spatial-temporal inform ...
- ASP.NET Forms验证
/// <summary> /// 执行用户登录操作 /// </summary> /// <param name="config">授权配置信 ...
- jQuery(六)
$下常用方法 $().xxx:只能给jq对象用 $.xxx不仅可以给jq用也可以给原生js用,叫做工具方法 $.type() <script> $(function(){ var a= n ...
- activiti-explorer disable demo
https://community.alfresco.com/thread/203012-activiti-explorer engine.properties # demo data propert ...
- Angular @的作用
<!DOCTYPE html><html lang="zh-cn" ng-app="myApp"><head> <me ...
- OA与BPM的区别
BPM OA 软件架构 JAVA..NET.基于SOA架构 JAVA..NET.PHP.Domino 驱动模式 流程驱动 文档驱动 交互 人与人,人与系统,系统与系统 人与人 软件功能 ...
- Java 数组实现 stack
首先定义 IStack package cn.com.example.stack; /** * Created by Jack on 2017/3/8. */ public interface ISt ...
- python之tkinter使用-单级菜单
# 菜单功能说明:单级菜单 import tkinter as tk root = tk.Tk() root.title('菜单选择') root.geometry('200x60') # 设置窗口大 ...
- Java和Spring邮件的发送
方法一: java发送电子邮件:这里以发送qq邮件为例: package test; import java.util.Properties; import javax.mail.Authentica ...