链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586

题意:n个村庄构成一棵无根树,q次询问,求任意两个村庄之间的最短距离

思路:求出两个村庄的LCA,dis[ i ] 表示结点 i 到树根的距离,那么任意两点u,v的最短距离就是dis[ u ]  - dis [LCA] + dis [ v ] - dis[ LCA ]。代码是用tarjan做的,算是模板,记录一下。

AC代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn = ;
struct node{//询问的结点x,y
int x,y;
int lca;
}query[maxn];
struct e{//建边
int to;
int val;
};
int dis[maxn];
vector<e> G[maxn];
vector<int> Q[maxn];
bool vis[maxn];
int N;
int fa[maxn];
void init(){//初始化父亲结点
for(int i = ;i<maxn;i++) fa[i] = i;
}
int find(int x){//并查集find函数
if(x == fa[x]) return x;
return fa[x] = find(fa[x]);
}
void tarjan(int cur){
vis[cur] = true;//标记cur已访问过
for(auto q:Q[cur]){//遍历包含cur结点的询问
if(query[q].x == cur){
if(vis[query[q].y]) {//若x == cur且y已经被访问过,搜y的祖先,就是其LCA
query[q].lca = find(query[q].y);
}
}
else{
if(vis[query[q].x]){//若y == cur且x已经被访问过,搜x的祖先,就是其LCA
query[q].lca = find(query[q].x);
}
}
}
for(auto e:G[cur]){//遍历cur结点的儿子结点
int v = e.to , len = e.val ;
if(vis[v]) continue;
dis[v] = dis[cur] + len;//dis记录cur到root的距离
tarjan(v);
fa[v] = cur; //设置cur结点子节点的父亲为cur
}
}
int main(){
int t;scanf("%d",&t);
while(t--){
scanf("%d",&N);
int q;
memset(vis,,sizeof(vis));
init();
for(int i = ;i<maxn;i++) {//初始化
Q[i].clear() ,G[i].clear() ;
query[i].lca = ,query[i].x = ,query[i].y = ;
}
scanf("%d",&q);
for(int i = ;i<=N-;i++){
int u,v,k;
scanf("%d%d%d",&u,&v,&k);
G[u].push_back({v,k}); //建图
G[v].push_back({u,k});
}
for(int i = ;i<=q;i++){
scanf("%d%d",&query[i].x ,&query[i].y );
Q[query[i].x ].push_back(i);
Q[query[i].y ].push_back(i); //离线存储所有询问 ,i为标号
}
tarjan();
for(int i = ;i<=q;i++){
int LCA = query[i].lca ;
int ans = dis[query[i].x ] + dis[query[i].y ] - *dis[LCA];//输出所有的询问
printf("%d\n",ans);
}
}
return ;
}

HDU 2586 ( LCA/tarjan算法模板)的更多相关文章

  1. hdu 2586 lca在线算法(朴素算法)

    #include<stdio.h> #include<string.h>//用c/c++会爆栈,用g++ac #define inf 0x3fffffff #define N ...

  2. hdu 2586(Tarjan 离线算法)

    How far away ?                                                                             Time Limi ...

  3. 最近公共祖先LCA(Tarjan算法)的思考和算法实现

    LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现 小广告:METO CODE 安溪一中信息学在线评测系统(OJ) //由于这是第一篇博客..有点瑕疵...比如我把false写成了f ...

  4. 最近公共祖先LCA(Tarjan算法)的思考和算法实现——转载自Vendetta Blogs

    LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现 小广告:METO CODE 安溪一中信息学在线评测系统(OJ) //由于这是第一篇博客..有点瑕疵...比如我把false写成了f ...

  5. [CF 191C]Fools and Roads[LCA Tarjan算法][LCA 与 RMQ问题的转化][LCA ST算法]

    参考: 1. 郭华阳 - 算法合集之<RMQ与LCA问题>. 讲得很清楚! 2. http://www.cnblogs.com/lazycal/archive/2012/08/11/263 ...

  6. Tarjan 算法求 LCA / Tarjan 算法求强连通分量

    [时光蒸汽喵带你做专题]最近公共祖先 LCA (Lowest Common Ancestors)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili tarjan LCA - YouTube Tarj ...

  7. Tarjan 算法&模板

    Tarjan 算法 一.算法简介 Tarjan 算法一种由Robert Tarjan提出的求解有向图强连通分量的算法,它能做到线性时间的复杂度. 我们定义: 如果两个顶点可以相互通达,则称两个顶点强连 ...

  8. HDU 2586 LCA

    题目大意: 多点形成一棵树,树上边有权值,给出一堆询问,求出每个询问中两个点的距离 这里求两个点的距离可以直接理解为求出两个点到根节点的权值之和,再减去2倍的最近公共祖先到根节点的距离 这是自己第一道 ...

  9. POJ 1330 Nearest Common Ancestors(LCA Tarjan算法)

    题目链接:http://poj.org/problem?id=1330 题意:给定一个n个节点的有根树,以及树中的两个节点u,v,求u,v的最近公共祖先. 数据范围:n [2, 10000] 思路:从 ...

随机推荐

  1. Perl-统计某电路面积、功耗占比(NVDIA2019笔试)

    1.perl脚本 open IN, "<", "data.txt" or die "The file does not exist!" ...

  2. docker配置搭建gogs

    参考文献: https://www.yeboyzq.com/linux/ruanjiananzhuangweihu/1012.html https://www.jianshu.com/p/d92fd4 ...

  3. 进程无法连接到 Subscriber"XXXXXXX"

    进程无法连接到 Subscriber“APP07”. 在订阅的机器上config 添加别名 APP07

  4. Git的学习和使用

    1.1. Git 了解git的仓库概念 熟悉何为版本控制,了解分布式版本控制(git)和集中式版本控制(svn) 能够熟练使用git的基本指令完成仓库的初始化/添加/提交/日志/回退/分支等操作 gi ...

  5. adb -- cannot connect to x.x.x.x:5555“由于目标计算机积极拒绝,无法连接”

    原因 安卓系统未打开adb网络调试功能 通过USB方式连接到安卓系统设置即可 解决 先通过USB线连接 adb devices 能看到所连接的设备情况下 adb root 权限提权 adb shell ...

  6. vue项目中使用element ui上传图片到七牛

    1.获取token值 后台有接口调用直接返回token值 //请求后台拿七牛云token async getQiniuToken() { //token let uploadtoken = await ...

  7. 【Python】七段数码管绘制问题

    问题分析: 绘制路径: 代码: import turtle #引入绘图库turtle def drawLine(draw): #绘制单段数码管 turtle.pendown() if draw els ...

  8. 提取 Microsoft.ReportViewer等dll

    ReportViewer 在开发环境没问题 发布以后可能会提示找不到 Microsoft.ReportViewer 下的几个dll 可以用用下面脚本在开发服务器上提取 相应的dll @SET dest ...

  9. LayIM聊天框全屏根据浏览器高宽自适应

    个人博客 地址:http://www.wenhaofan.com/article/20190410190628 问题 由于LayIM没有处理聊天框在全屏状态下根据浏览器缩放处理高宽,所以会导致在浏览器 ...

  10. 0级搭建类003-CentOS Linux安装 (CentOS 7)公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...