hdu 2586(LCA的离线做法)
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的离线做法)相关推荐
- hdu 2586 (LCA)
最近公共祖先.. 表示卡在一个位置卡了很久..思维还是差了些,在一颗树上记录距离只需记录到根结点的距离,如果要求两个点的距离(一个点时另一个点的祖先)只需将他们到根结点的距离相减就行了. 唉,其他的就 ...
- hdu 2586(LCA + 节点间距离)
题意:给一棵树,询问u和v之间的边权和. 解题思路:找到u和v的最近公共祖先,它们之间的距离为dis[u]+dis[v]-2*dis[lca(u,v)] #include<iostream> ...
- HDU - 2586 How far away LCA+tanjar离线算法
传送门 题意:求树上的两点的距离,放在一棵树上,而且题目提示只有一条,很明显是这条路线一定会经过他们的最近公共祖先啦,然后就是一个求距离的问题了.如果要采用离线算法的话,就是通过处理所有询问,那么肯定 ...
- HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法
tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...
- HDU 2586 How far away ?【LCA】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意: 无向图,给定边及边权重,任意两点之间都有一条唯一的道路,道路上每个点只能出现一次.给定 ...
- P4211 [LNOI2014]LCA(离线 + 在线 做法)
P4211 [LNOI2014]LCA 有一棵根节点为111树,有mmm次询问,每次给定l,r,zl, r, zl,r,z,输出∑i=lrdep[lca(i,z)]\sum\limits_{i = l ...
- HDU - 2586 How far away ?(离线Tarjan算法)
1.给定一棵树,每条边都有一定的权值,q次询问,每次询问某两点间的距离. 2.这样就可以用LCA来解,首先找到u, v 两点的lca,然后计算一下距离值就可以了. 这里的计算方法是,记下根结点到任意一 ...
- HDU - 2586 How far away ?(LCA)
题目链接:点击查看 题目分析:给出n个节点组成的一棵树,每条边都有一个权值w,现在给出m个询问,每次询问需要回答点x到点y之间的距离之和 题目分析:因为看到了两点之间的距离之和,一开始是想直接上树链剖 ...
- *【HDU - 2586】How far away ? (LCA模板题,倍增)
题干: There are n houses in the village and some bidirectional roads connecting them. Every day peole ...
最新文章
- 了解和入门注解的应用
- 安全预测 影响企业风险管理的三大趋势
- Python学习之==面向对象编程(一)
- 空间离散点拟合成空间平面
- NoSQL开篇——为什么要使用NoSQL
- FJ的字符串java问题_蓝桥杯VIP试题 之 基础练习 FJ的字符串- JAVA
- Qt文档阅读笔记-关于Qt Core的进一步认识
- 核心技能点-二分查找
- python字符的大小比较_python中字符串怎么比较大小
- 开源影响发量?这届开源中的巾帼力量
- JAVA三大框架入门
- 数字电路-时序逻辑电路
- 还没来得及买,就已经被淘汰的东西
- 语音控制系统简易接线方法
- yaml 格式错误 did not find expected key
- 3GPP协议R15完整版下载
- 大数据要学javaweb吗_纠结!Java和大数据学哪个更好?
- 修改机顶盒设置移动焦点颜色
- java集合的接口和类层次结构图
- 文本域 自定义下拉框 支持模糊检索 关键字高亮 上下选择