参考博客

参考博客

根据博客的模拟,就可以知道做法和思想。

现在就是实现他。

例题 :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 算法的更多相关文章

  1. hdu 3078(LCA的在线算法)

    Network Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  2. 最近公共祖先(LCA)---tarjan算法

    LCA(最近公共祖先).....可惜我只会用tarjan去做 真心感觉tarjan算法要比倍增算法要好理解的多,可能是我脑子笨吧略略略 最近公共祖先概念:在一棵无环的树上寻找两个点在这棵树上深度最大的 ...

  3. POJ 1470 Closest Common Ancestors (最近公共祖先LCA 的离线算法Tarjan)

    Tarjan算法的详细介绍,请戳: http://www.cnblogs.com/chenxiwenruo/p/3529533.html #include <iostream> #incl ...

  4. 【HDU 4547 CD操作】LCA问题 Tarjan算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4547 题意:模拟DOS下的cd命令,给出n个节点的目录树以及m次查询,每个查询包含一个当前目录cur和 ...

  5. 【HDU 2586 How far away?】LCA问题 Tarjan算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:给出一棵n个节点的无根树,每条边有各自的权值.给出m个查询,对于每条查询返回节点u到v的最 ...

  6. 【POJ 1330 Nearest Common Ancestors】LCA问题 Tarjan算法

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

  7. LCA的倍增算法

    LCA,即树上两点之间的公共祖先,求这样一个公共祖先有很多种方法: 暴力向上:O(n) 每次将深度大的点往上移动,直至二者相遇 树剖:O(logn) 在O(2n)预处理重链之后,每次就将深度大的沿重链 ...

  8. LCA(倍增在线算法) codevs 2370 小机房的树

    codevs 2370 小机房的树 时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点, ...

  9. POJ1470Closest Common Ancestors 最近公共祖先LCA 的 离线算法 Tarjan

    该算法的详细解释请戳: http://www.cnblogs.com/Findxiaoxun/p/3428516.html #include<cstdio> #include<alg ...

随机推荐

  1. log4j日志记录到文件

    要写日志信息到一个文件中,必须使用org.apache.log4j.FileAppender.有以下FileAppender的配置参数: FileAppender配置: 属性 描述 immediate ...

  2. 如何将英文版的Firefox添加中文版语言包

    http://ftp.mozilla.org/pub/firefox/releases/ xpi中下载zh_CN.xpi 文件 , 把文件拖拽进火狐浏览器 在地址栏输入”about:config”,回 ...

  3. Android组件内核之间组件间通信方案(四)下篇

    阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680本篇文章将继续从以下两个内容来介绍通信方案: [ViewModel 与 V ...

  4. Vue-cli中的静态资源管理(src/assets和static/的区别)

    资源打包 为了回答这个问题,我们需要了解webpack是如何处理静态资源的.在所有的*.vue文件中你所有的templates 和CSS 都被vue-html-loader 和css-loader 查 ...

  5. mybatis中的命名空间(namespace)的作用

    mybatis中为每一个映射文件添加一个namespace,这样不同的映射文件中sql语句的id相同也不会有冲突,只要定义在映射文件中的sql语句在该映射文件中id唯一就可以

  6. redis 发布订阅(pub/sub )

  7. Linux环境安装Nginx步骤

    centos7平台编译环境使用如下指令安装: 1. 安装make: yum -y install gcc automake autoconf libtool make 2. 安装g++: yum -y ...

  8. dubbo-源码阅读之Filter实现原理

    最近完成一个需求,使用阿里Arms需要在log里面加上traceId,但是发现dubbo异常 被ExceptionFilter捕获 并打印  打印不出traceI,然后百度搜索如何重写Filter 参 ...

  9. Spring定时任务的几种实现(转)

    转自:http://gong1208.iteye.com/blog/1773177 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几 ...

  10. Django之ModelForm操作

    一.ModelForm的使用 顾名思义,ModelForm就是将Model与Form进行绑定,Form有自动生成表单的作用,但是每一个forms字段需要自己手动填写,而Model就是数据库表包含了所有 ...