解题关键:LCA模板题

复杂度:$O(n\log n)$

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cstdlib>
  6. #include<cmath>
  7. #include<iostream>
  8. typedef long long ll;
  9. using namespace std;
  10. const int maxn=;
  11. const int maxm=;
  12. int _pow[maxm],m,n;
  13. int head[maxn],tot;
  14. int ver[maxn*],depth[maxn*],first[maxn],rmq[maxn*][maxm],id;//5个数组,注意哪个需要乘2
  15. ll dis[maxn];
  16. inline int read(){
  17. char k=;char ls;ls=getchar();for(;ls<''||ls>'';k=ls,ls=getchar());
  18. int x=;for(;ls>=''&&ls<='';ls=getchar())x=(x<<)+(x<<)+ls-'';
  19. if(k=='-')x=-x;return x;
  20. }
  21.  
  22. struct edge{
  23. int to,w,nxt;
  24. }e[maxn*];//链式前向星建树
  25.  
  26. void init(){
  27. memset(head,-,sizeof head);
  28. tot=;
  29. id=;
  30. }
  31.  
  32. void add_edge(int u,int v,int w){
  33. e[tot].to=v;
  34. e[tot].w=w;
  35. e[tot].nxt=head[u];
  36. head[u]=tot++;
  37. }
  38.  
  39. void dfs(int u,int fa,int dep){
  40. ver[++id]=u;//第i个访问到的结点编号
  41. depth[id]=dep;//第i个访问到的结点深度
  42. first[u]=id;
  43. for(int i=head[u];i!=-;i=e[i].nxt){
  44. int v=e[i].to;
  45. int w=e[i].w;
  46. if(v==fa) continue;
  47. dis[v]=dis[u]+w;//dis是先序遍历求
  48. dfs(v,u,dep+);
  49. ver[++id]=u;//后序遍历,再次访问父节点
  50. depth[id]=dep;
  51. }
  52. }
  53.  
  54. void rmq_init(int n){
  55. int k=int(log(n)/log());
  56. for(int i=;i<=n;++i) rmq[i][]=i;
  57. for(int j=;j<=k;++j){
  58. for(int i=;i+_pow[j]-<=n;++i){//因为存的是索引
  59. int a=rmq[i][j-],b=rmq[i+_pow[j-]][j-];
  60. if(depth[a]<depth[b]) rmq[i][j]=a;
  61. else rmq[i][j]=b;
  62. }
  63. }
  64. }
  65.  
  66. int rmq_query(int l,int r){
  67. int k=int(log(r-l+1.0)/log(2.0));
  68. int a=rmq[l][k],b=rmq[r-_pow[k]+][k];
  69. if(depth[a]<depth[b]) return a;
  70. else return b;
  71. }//返回的依然是索引
  72.  
  73. int LCA(int u,int v){
  74. int x=first[u],y=first[v];
  75. if(x>y)swap(x,y);
  76. int res=rmq_query(x,y);
  77. return ver[res];
  78. }
  79.  
  80. int main(){
  81. for(int i=;i<maxm;++i) _pow[i]=<<i; //预处理2^n
  82. int t,a,b,c;
  83. init();
  84. n=read(),m=read();
  85. for(int i=;i<m;++i){
  86. scanf("%d%d%d %*c",&a,&b,&c);
  87. add_edge(a,b,c);
  88. add_edge(b,a,c);
  89. }
  90. dfs(,-,);
  91. rmq_init(*n-);
  92. int m;
  93. m=read();
  94. for(int i=;i<m;++i){
  95. a=read();b=read();
  96. int ans=LCA(a,b);
  97. printf("%lld\n",dis[a]+dis[b]-*dis[ans]);
  98. }
  99.  
  100. return ;
  101. }

[poj1986]Distance Queries(LCA)的更多相关文章

  1. poj-1986 Distance Queries(lca+ST+dfs)

    题目链接: Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 11531   Accepted ...

  2. POJ.1986 Distance Queries ( LCA 倍增 )

    POJ.1986 Distance Queries ( LCA 倍增 ) 题意分析 给出一个N个点,M条边的信息(u,v,w),表示树上u-v有一条边,边权为w,接下来有k个询问,每个询问为(a,b) ...

  3. POJ1986 Distance Queries (LCA)(倍增)

    Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 12950   Accepted: 4577 ...

  4. poj 1986 Distance Queries LCA

    题目链接:http://poj.org/problem?id=1986 Farmer John's cows refused to run in his marathon since he chose ...

  5. POJ 1986 Distance Queries(LCA Tarjan法)

    Distance Queries [题目链接]Distance Queries [题目类型]LCA Tarjan法 &题意: 输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面 ...

  6. POJ 1986 - Distance Queries - [LCA模板题][Tarjan-LCA算法]

    题目链接:http://poj.org/problem?id=1986 Description Farmer John's cows refused to run in his marathon si ...

  7. POJ 1986 Distance Queries LCA两点距离树

    标题来源:POJ 1986 Distance Queries 意甲冠军:给你一棵树 q第二次查询 每次你问两个点之间的距离 思路:对于2点 u v dis(u,v) = dis(root,u) + d ...

  8. poj1986 Distance Queries(lca又是一道模版题)

    题目链接:http://poj.org/problem?id=1986 题意:就是老问题求val[u]+val[v]-2*val[root]就行.还有这题没有给出不联通怎么输出那么题目给出的数据一定 ...

  9. POJ 1986 Distance Queries(Tarjan离线法求LCA)

    Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 12846   Accepted: 4552 ...

随机推荐

  1. leetCode 90.Subsets II(子集II) 解题思路和方法

    Given a collection of integers that might contain duplicates, nums, return all possible subsets. Not ...

  2. ios导航栏问题

    http://m.blog.csdn.net/article/details?id=47395605

  3. 扩容数据盘_Linux

    扩容数据盘_Linux_扩容云盘_云盘_用户指南_云服务器 ECS-阿里云 https://help.aliyun.com/document_detail/25452.html 磁盘扩容付费后: 在控 ...

  4. 借助nodejs解析加密字符串 node安装库较python方便

    const node_modules_path = '../node_modules/' // crypto-js - npm https://www.npmjs.com/package/crypto ...

  5. Leslie Lamport

    http://lamport.azurewebsites.net/pubs/pubs.html paper

  6. 【题解】数字组合(NTT+组合 滑稽)

    [题解]数字组合(NTT+组合 滑稽) 今天实践一下谢总讲的宰牛刀233,滑稽. \((1+x)(1+x)(1+x)\)的\(x^2\)系数就代表了有三个一快钱硬币构成的两块钱的方案数量. 很好理解, ...

  7. BZOJ2539: [Ctsc2000]丘比特的烦恼

    BZOJ2539: [Ctsc2000]丘比特的烦恼 Description 随着社会的不断发展,人与人之间的感情越来越功利化. 最近,爱神丘比特发现,爱情也已不再是完全纯洁的了. 这使得丘比特很是苦 ...

  8. python3用pdfminer3k在线读取pdf文件

    import importlib import sys import random from urllib.request import urlopen from urllib.request imp ...

  9. Swift 烧脑体操(四) - map 和 flatMap

    前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说更加困 ...

  10. linux 下ftp的安装配置 图文教程

    0.安装ftp的前置条件是关掉SElinux # vi /etc/selinux/config 修改 SELINUX=” disabled ” ,重启服务器.若相同,则跳过此步骤. 1. 可先查看是否 ...