HDU 2586 ( LCA/tarjan算法模板)
链接: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算法模板)的更多相关文章
- hdu 2586 lca在线算法(朴素算法)
#include<stdio.h> #include<string.h>//用c/c++会爆栈,用g++ac #define inf 0x3fffffff #define N ...
- hdu 2586(Tarjan 离线算法)
How far away ? Time Limi ...
- 最近公共祖先LCA(Tarjan算法)的思考和算法实现
LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现 小广告:METO CODE 安溪一中信息学在线评测系统(OJ) //由于这是第一篇博客..有点瑕疵...比如我把false写成了f ...
- 最近公共祖先LCA(Tarjan算法)的思考和算法实现——转载自Vendetta Blogs
LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现 小广告:METO CODE 安溪一中信息学在线评测系统(OJ) //由于这是第一篇博客..有点瑕疵...比如我把false写成了f ...
- [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 ...
- Tarjan 算法求 LCA / Tarjan 算法求强连通分量
[时光蒸汽喵带你做专题]最近公共祖先 LCA (Lowest Common Ancestors)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili tarjan LCA - YouTube Tarj ...
- Tarjan 算法&模板
Tarjan 算法 一.算法简介 Tarjan 算法一种由Robert Tarjan提出的求解有向图强连通分量的算法,它能做到线性时间的复杂度. 我们定义: 如果两个顶点可以相互通达,则称两个顶点强连 ...
- HDU 2586 LCA
题目大意: 多点形成一棵树,树上边有权值,给出一堆询问,求出每个询问中两个点的距离 这里求两个点的距离可以直接理解为求出两个点到根节点的权值之和,再减去2倍的最近公共祖先到根节点的距离 这是自己第一道 ...
- POJ 1330 Nearest Common Ancestors(LCA Tarjan算法)
题目链接:http://poj.org/problem?id=1330 题意:给定一个n个节点的有根树,以及树中的两个节点u,v,求u,v的最近公共祖先. 数据范围:n [2, 10000] 思路:从 ...
随机推荐
- 数据结构(集合)学习之Map(二)
集合 框架关系图 补充:HashTable父类是Dictionary,不是AbstractMap. 一:HashMap中的链循环: 一般来说HashMap中的链循环会发生在多线程操作时(虽然HashM ...
- P2055 [ZJOI2009]假期的宿舍【二分图/最大流】
题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题. 比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识 ...
- 【笔记】机器学习 - 李宏毅 - 3 - Bias & Variance
A more complex model does not always lead to better performance on testing data. Because error due t ...
- mysql查询中字符串转换成数字
在操作mysql时,经常需要将字符转换成数字,这一步虽然简单,但不常用的话也很容易忘记,现将在网上找到的方法记录如下: 1.将字符的数字转成数字,比如'0'转成0可以直接用加法来实现例如:将pony表 ...
- phpcms搜索给分页代码添加参数方法
在使用PHPCMS开发网站时遇到了一个搜索功能,需要在搜索结果分页链接上添加一些传递的参数,不然不能够正确翻页. 方法: 找到\phpcms\libs\functions\global.func.ph ...
- LeetCode 13、罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1.12 ...
- BZOJ2809&&LG1552 APIO2012派遣(线段树合并)
BZOJ2809&&LG1552 APIO2012派遣(线段树合并) 题面 自己找去 HINT 简化一题面就是让你从每个点的子树中以\(<=m\)的代价选取尽可能多的点,然后乘上 ...
- Windows Server多用户同时远程登录
因为工作需要,需要使用windwos作为一个远程登录跳板机,管理员对登录windwos机器再windwos的基础上连接别的机器,普通用户也可以连接windwos机器再连接别的机器,关于管理员普通用户连 ...
- mybatis - 基于拦截器修改执行语句中的ResultMap映射关系
拦截器介绍 mybatis提供了@Intercepts注解允许开发者对mybatis的执行器Executor进行拦截. Executor接口方法主要有update.query.commit.rollb ...
- 求素数p的原根
定义: 设m>1,gcd(a,m)=1,使得成立的最小正整数d为a对模m的阶,记为δm(a) 如果δm(a)=φ(m),则称a是模m的原根 定理:设m>1,gcd(a,m)=1,那么正整数 ...