lca上的tarjan,改了我一下午加一晚上的bug,还无奈重写了一次。就是寻找最近公共祖先lca(u,v

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=40000+100;
int n,m,k1,k2,t;
int hade1[maxn],hade2[maxn];
int d[maxn],c[maxn];
bool vis[maxn];
struct note
{    int fr;int next;int to;int len;int lca;
}aa[maxn*2],bb[1000];
void addage1(int fr,int to,int len)
{aa[k1].to=to;aa[k1].len=len;aa[k1].next=hade1[fr];hade1[fr]=k1++;
}
void addage2(int fr,int to)
{bb[k2].fr=fr;bb[k2].to=to;bb[k2].lca=-1;bb[k2].next=hade2[fr];hade2[fr]=k2++;
}
void init()
{memset(hade1,-1,sizeof(hade1));memset(hade2,-1,sizeof(hade2));memset(d,0,sizeof(d));memset(vis,0,sizeof(vis));k1=k2=0;
}
int found(int x)
{if(x==c[x]) return x;else return c[x]=found(c[x]);
}
void unit(int x,int y)
{x=found(x);y=found(y);if(x!=y)c[y]=x;
}
void tarjan(int u)
{vis[u]=1;c[u]=u;for(int i=hade1[u];i!=-1;i=aa[i].next){int v=aa[i].to;int w=aa[i].len;if(!vis[v]){d[v]=d[u]+w;//从此节点到根节点的距离
             tarjan(v);unit(u,v);}}for(int i=hade2[u];i!=-1;i=bb[i].next){int v=bb[i].to;if(vis[v]){bb[i].lca=bb[i^1].lca=found(v);//回溯的是u和v最近公共子节点的分支,所以v是指向最近公共子节点的
          }}}
int main()
{scanf("%d",&t);while(t--){   init();scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int fr,to,len;scanf("%d%d%d",&fr,&to,&len);addage1(fr,to,len);addage1(to,fr,len);}for(int i=0;i<m;i++){int fr,to;scanf("%d%d",&fr,&to);addage2(fr,to);addage2(to,fr);}d[1]=0;tarjan(1);for(int i=0;i<m;i++){int s=i*2;int u=bb[s].fr,v=bb[s].to,lca=bb[s].lca;int mm=d[u]+d[v]-2*d[lca];printf("%d\n",mm);}}return 0;
}

转载于:https://www.cnblogs.com/Wangwanxiang/p/7524545.html

hdu 2586(LCA的离线做法)相关推荐

  1. hdu 2586 (LCA)

    最近公共祖先.. 表示卡在一个位置卡了很久..思维还是差了些,在一颗树上记录距离只需记录到根结点的距离,如果要求两个点的距离(一个点时另一个点的祖先)只需将他们到根结点的距离相减就行了. 唉,其他的就 ...

  2. hdu 2586(LCA + 节点间距离)

    题意:给一棵树,询问u和v之间的边权和. 解题思路:找到u和v的最近公共祖先,它们之间的距离为dis[u]+dis[v]-2*dis[lca(u,v)] #include<iostream> ...

  3. HDU - 2586 How far away LCA+tanjar离线算法

    传送门 题意:求树上的两点的距离,放在一棵树上,而且题目提示只有一条,很明显是这条路线一定会经过他们的最近公共祖先啦,然后就是一个求距离的问题了.如果要采用离线算法的话,就是通过处理所有询问,那么肯定 ...

  4. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法

    tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...

  5. HDU 2586 How far away ?【LCA】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意: 无向图,给定边及边权重,任意两点之间都有一条唯一的道路,道路上每个点只能出现一次.给定 ...

  6. P4211 [LNOI2014]LCA(离线 + 在线 做法)

    P4211 [LNOI2014]LCA 有一棵根节点为111树,有mmm次询问,每次给定l,r,zl, r, zl,r,z,输出∑i=lrdep[lca(i,z)]\sum\limits_{i = l ...

  7. HDU - 2586 How far away ?(离线Tarjan算法)

    1.给定一棵树,每条边都有一定的权值,q次询问,每次询问某两点间的距离. 2.这样就可以用LCA来解,首先找到u, v 两点的lca,然后计算一下距离值就可以了. 这里的计算方法是,记下根结点到任意一 ...

  8. HDU - 2586 How far away ?(LCA)

    题目链接:点击查看 题目分析:给出n个节点组成的一棵树,每条边都有一个权值w,现在给出m个询问,每次询问需要回答点x到点y之间的距离之和 题目分析:因为看到了两点之间的距离之和,一开始是想直接上树链剖 ...

  9. *【HDU - 2586】How far away ? (LCA模板题,倍增)

    题干: There are n houses in the village and some bidirectional roads connecting them. Every day peole ...

最新文章

  1. 了解和入门注解的应用
  2. 安全预测 影响企业风险管理的三大趋势
  3. Python学习之==面向对象编程(一)
  4. 空间离散点拟合成空间平面
  5. NoSQL开篇——为什么要使用NoSQL
  6. FJ的字符串java问题_蓝桥杯VIP试题 之 基础练习 FJ的字符串- JAVA
  7. Qt文档阅读笔记-关于Qt Core的进一步认识
  8. 核心技能点-二分查找
  9. python字符的大小比较_python中字符串怎么比较大小
  10. 开源影响发量?这届开源中的巾帼力量
  11. JAVA三大框架入门
  12. 数字电路-时序逻辑电路
  13. 还没来得及买,就已经被淘汰的东西
  14. 语音控制系统简易接线方法
  15. yaml 格式错误 did not find expected key
  16. 3GPP协议R15完整版下载
  17. 大数据要学javaweb吗_纠结!Java和大数据学哪个更好?
  18. 修改机顶盒设置移动焦点颜色
  19. java集合的接口和类层次结构图
  20. 文本域 自定义下拉框 支持模糊检索 关键字高亮 上下选择

热门文章

  1. 玩吧高速增长的数据上云实践
  2. 游戏角色制作行业标准? 快来看看吧
  3. mysql超经典的8小时问题-wait_timeout
  4. java定时执行一段代码
  5. PHP面试题:你所知道的php数组相关的函数?
  6. Java扑克牌(enum)
  7. 去 IOE,MySQL 完胜 PostgreSQL
  8. 运行脚本时用SPOOL保存运行结果的问题
  9. 卸载VMware Workstation出现错误: vmware-vmx.exe错误
  10. 浅谈unity中gamma空间和线性空间