LCA的 Trajan 算法
根据博客的模拟,就可以知道做法和思想。
现在就是实现他。
例题 :hdu 2586
题意:m 个询问,x 到 y 的距离,我们的思想就是求出:x到根的距离+y到根的距离-2*(lca[ x ,y ])到跟的距离。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int max_edge=;//边数
const int max_Q=;//问题
const int max_=;//节点
struct Tree{//树-邻接表
int to;
int v;
int next;
};
struct Question{//离线-问题
int to;
int id;
int next;
};
struct Tree a[max_edge];//树数组
struct Question b[max_];//问题数组
int N,M;
int edge[max_];//边记录next
int tot1,tot2;
bool vis[max_];//标记数组
int st[max_Q],ed[max_Q];//问题的x和y
int question[max_];//问题-记录next
int fa[max_];//父节点
int dis[max_];//到根的距离
int LCA[max_Q];//问题的LCA
void add_edge(int x,int y,int v)//建树
{
a[++tot1].to=y;
a[tot1].v=v;
a[tot1].next=edge[x];
edge[x]=tot1;
}
void add_question(int x,int y,int id)//离线
{
b[++tot2].to=y;
b[tot2].id=id;
b[tot2].next=question[x];
question[x]=tot2;
}
int find_fa(int x)//寻找父节点
{
if(fa[x]==x)
return x;
return fa[x]=find_fa(fa[x]);
}
void Tarjan(int x)
{
fa[x]=x;//作为当前的根节点,将其父亲指向自己
vis[x]=;//标记
for(int i=question[x];i;i=b[i].next)//寻找问题中与自己有关节点
{
int go_to=b[i].to;
if(vis[go_to]==true)//如果有关节点走过,记录LCA
LCA[b[i].id]=find_fa(go_to);
}
for(int i=edge[x];i;i=a[i].next)//沿边遍历
{
int go_to=a[i].to;
if(vis[go_to]==false)
{
dis[go_to]=dis[x]+a[i].v;//更新距离
Tarjan(go_to);//递归遍历
fa[go_to]=x;//归并父节点
}
}
}
int main()
{
int T;
cin>>T;//测试组数
while(T--)
{
memset(vis,,sizeof(vis));
memset(question,,sizeof(question));
memset(edge,,sizeof(edge));
memset(dis,,sizeof(dis));
memset(LCA,,sizeof(LCA));
tot1=,tot2=;//初始归零
cin>>N>>M;
for(int i=;i<N-;i++)
{
int x,y,v;
cin>>x>>y>>v;
add_edge(x,y,v);//双向建边
add_edge(y,x,v);
}
for(int i=;i<M;i++)
{
int x,y;
cin>>x>>y;
add_question(x,y,i);
add_question(y,x,i);//保证找有关点时不漏
st[i]=x,ed[i]=y;//记录问题的x,y
}
Tarjan();
for(int i=;i<M;i++)
{
int temp=dis[st[i]]+dis[ed[i]]-(*dis[LCA[i]]);//结果
cout<<temp<<endl;
}
}
}
LCA的 Trajan 算法的更多相关文章
- hdu 3078(LCA的在线算法)
Network Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- 最近公共祖先(LCA)---tarjan算法
LCA(最近公共祖先).....可惜我只会用tarjan去做 真心感觉tarjan算法要比倍增算法要好理解的多,可能是我脑子笨吧略略略 最近公共祖先概念:在一棵无环的树上寻找两个点在这棵树上深度最大的 ...
- POJ 1470 Closest Common Ancestors (最近公共祖先LCA 的离线算法Tarjan)
Tarjan算法的详细介绍,请戳: http://www.cnblogs.com/chenxiwenruo/p/3529533.html #include <iostream> #incl ...
- 【HDU 4547 CD操作】LCA问题 Tarjan算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4547 题意:模拟DOS下的cd命令,给出n个节点的目录树以及m次查询,每个查询包含一个当前目录cur和 ...
- 【HDU 2586 How far away?】LCA问题 Tarjan算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:给出一棵n个节点的无根树,每条边有各自的权值.给出m个查询,对于每条查询返回节点u到v的最 ...
- 【POJ 1330 Nearest Common Ancestors】LCA问题 Tarjan算法
题目链接:http://poj.org/problem?id=1330 题意:给定一个n个节点的有根树,以及树中的两个节点u,v,求u,v的最近公共祖先. 数据范围:n [2, 10000] 思路:从 ...
- LCA的倍增算法
LCA,即树上两点之间的公共祖先,求这样一个公共祖先有很多种方法: 暴力向上:O(n) 每次将深度大的点往上移动,直至二者相遇 树剖:O(logn) 在O(2n)预处理重链之后,每次就将深度大的沿重链 ...
- LCA(倍增在线算法) codevs 2370 小机房的树
codevs 2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点, ...
- POJ1470Closest Common Ancestors 最近公共祖先LCA 的 离线算法 Tarjan
该算法的详细解释请戳: http://www.cnblogs.com/Findxiaoxun/p/3428516.html #include<cstdio> #include<alg ...
随机推荐
- CF_127E reader Display
这道题其实找到规律之后其实不难,和破损的键盘一样,都有点递推转移的感觉 题意: 你可以进行这样一次操作:选一个点,然后把这个点横切竖切直到正对角线上面的点,全部翻转过来,问你要进行多少次操作才能把所有 ...
- 在webpack4 中利用Babel 7取消严格模式方法
报错信息: Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on stri ...
- 抓取猫眼TOP100的数据
import requests import re import json from multiprocessing import Pool from multiprocessing import M ...
- Redis源码编译安装
介绍 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis是一个开源的使用ANSI C语言编写.遵 ...
- 用Emacs进行Java开发
用Emacs进行Java开发 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} 用 ...
- Python面试题之“猴子补丁”(monkey patching)指的是什么?这种做法好吗?
“猴子补丁”就是指,在函数或对象已经定义之后,再去改变它们的行为. 举个例子: import datetime datetime.datetime.now = lambda: datetime.dat ...
- 16-vim-查找字符或单词-01-查找
1.常规查找 查找到指定内容之后,使用n查找下一个出现的位置. 命令 功能 /str 查找str 例:/python n 查找下一个 N 查找上一个 2.单词快速匹配(常用) 命令 功能 * 向下查找 ...
- 微服务-熔断器 Hystrix 的原理与使用
前言 分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应. 为了应对服务雪崩, 一种常见的做法是手动服务降级. 而Hystrix的出现,给我们提供了另一种选 ...
- 忘记root密码
Ubuntu密码恢复的方法如下: 1.重新启动,按ESC键进入Boot Menu,选择recovery mode(一般是第二个选项).2.在#号提示符下用cat /etc/shadow,看看用户名.3 ...
- 初探remoting双向通信(一)
原 初探remoting双向通信(一) 2013年06月24日 15:47:07 喜欢特别冷的冬天下着雪 阅读数 4389 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...