链接: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. Photoshop Elements2020强势来袭,教你三秒钟拯救闭眼照

    Photoshop Elements2020强势来袭,一系列的黑科技让设计师和路人都惊叹不已!若某人的闭眼成为一张集体照的败笔,那该如何挽回? 想要挽救闭眼照?听起来很高大上,很困难?不,Photos ...

  2. ajax发送请求下载字节流形式的excel文件

    背景 开发项目中导出功能,因为数据量有点大,所以导出可能需要时间有点长,所以想用ajax异步请求. 存在问题 利用传统的js和jquery提供的ajax相关获取响应的方式是无法实现excel文件下载的 ...

  3. VSCode添加git bash作为默认终端

    VSC添加git bash作为默认终端的settings.json添加 { "terminal.integrated.shell.windows": "D:\\Progr ...

  4. 76.0.3809.100版本的谷歌浏览器对应能用的chromedriver版本

    # -*- coding: utf-8 -*- # @Time : 2019/9/3 11:42 # @Author : wujf # @Email : 1028540310@qq.com # @Fi ...

  5. C语言输出杨辉三角形

    // 打印杨辉三角: 行 + 列 ][] = { }; // 1. 确定要打印的行数: 13(n) ; i < ; ++i) { // 2. 确定列数:杨辉三角 行 == 列 ; j <= ...

  6. ubantu crontab定时任务设置

    Lynx浏览器安装.安装命令:sudo apt-get install lynx.打开终端输入:crontab -e若初次执行会出现以下(选择编译器,一般选4(Vim))Select an edito ...

  7. 1级搭建类111-Oracle 19c SI FS(Windows Server 2019)公开

    Oracle 19c 单实例文件系统在Windows Server 2019上的安装 在线查看

  8. 0级搭建类012-Windows Server 2019安装(2019) 公开

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

  9. 数位dp(模板+例题)

    文章参考:数位dp之总结 首先,什么是数位dp?它是干什么的? 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数. 举个栗子: 加入我们要枚举所有上界不超过231 ...

  10. ASP.NET MVC模块化开发——动态挂载外部项目

    最近在开发一个MVC框架,开发过程中考虑到以后开发依托于框架的项目,为了框架的维护更新升级,代码肯定要和具体的业务工程分割开来,所以需要解决业务工程挂载在框架工程的问题,MVC与传统的ASP.NET不 ...