链接: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. 代数式到c语言表达式和常用的c语言数学库函数_pow_sqrt_exp_fabs_abs

    数学知识来源于生活,因此我们需要把相关的数学的知识在自己生活找到实例. #include "common.h" #include <stdio.h> #include ...

  2. vue 学习2

    模板指令.属性总结 html 中的标签属性 1. :class 值是对象,key为class 的值,值为boolean类型 html标签任意属性都可以:属性,表示动态值(值是变化的,不是固定不变的) ...

  3. cf1000E

    先缩点构造出一颗树,然后求树的直径就好 const int maxn=3e5+5; const int maxm=6e5+5; const int inf=1e9; int head[maxn],ve ...

  4. npm常用模块汇总

    npm常用模块汇总: 点击插件名字,查看使用文档 npm常用模块汇总 node常用模块汇总 gulp常用插件汇总 npx 使用教程:npx使用教程 bable:bable这是JavaScript编译器 ...

  5. install multiple versions of CUDA

    https://www.pugetsystems.com/labs/hpc/How-To-Install-CUDA-10-together-with-9-2-on-Ubuntu-18-04-with- ...

  6. 小白月赛22 J : 计算 A + B

    J:计算 A + B 考察点 : 高精度,字符串 坑点 : 字符串中可能全是数字,或者 + 超过 1 个,需要进行特殊判断 析题得侃: 关于高精度的各种板子 Code: #include <ve ...

  7. LAMP(六)之以CentOS6自带的rpm包组合安装lamp

    1.Centos7部署应用wordpress 1. 安装php.php-mysql.mariadb yum install php php-mysql mariadb-server 2. 测试 cd ...

  8. AOPS论坛上100+100个积分

    100+10 rare and irresistible integrals I bring you many beautiful integrals that I have collected ov ...

  9. maven通过pom文件下载相关依赖包的网址

    下载有关依赖插件的网址去MVNREPOSITORY仓库寻找对应的版本然后添加到pom文件中就可以自动下载了 网址为:https://mvnrepository.com

  10. lampp ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'lepus'

    解决方法: 在[mysqlld]段下增加如下代码:skip-grant-tables: 1.which mysql 查看mysql位置,例如:/opt/lampp/bin/mysql 2.进入配置my ...