trajan算法的离线做法实际就是先保存所有我们要查询的值和序号
trajan算法共需要以下几个函数:

  1. add函数,用于加入邻接表.需要四个数组,e,ne,h,w(分别指代位置对应的节点编号,下一个位置(模拟指针),头节点(链表第一个位置),权值)
  2. find函数,并查集思想,用于查找最近公共祖先.其中使用了路径压缩,即在find过程中也进行合并操做,需要一个数组p保存每个节点的父亲
  3. dfs函数,用于生成所有节点到根节点的距离(这里的根节点可以任意取,因为是树型结构,无环) 需要一个数组value保存每个节点到根节点的距离
  4. trajan函数,用于递归父节点并查询结果.需要一个状态数组st保存各节点处于什么状态.为0表示未访问,1表示在线,2表示已经结束,trajan函数重点分为两步(1.递归所有子节点,并设置他们的父节点2.遍历以当前根节点的所有查询,如果状态结束则可以计算)

树中两个节点的距离等于他们到根节点的距离和-2*最近公共祖先到根节点的距离

例题如下:

距离

给出 n 个点的一棵树,多次询问两点之间的最短距离。

注意:

边是无向的。
所有节点的编号是 1,2,…,n。
输入格式
第一行为两个整数 n 和 m。n 表示点数,m 表示询问次数;

下来 n−1 行,每行三个整数 x,y,k,表示点 x 和点 y 之间存在一条边长度为 k;

再接下来 m 行,每行两个整数 x,y,表示询问点 x 到点 y 的最短距离。

树中结点编号从 1 到 n。

输出格式
共 m 行,对于每次询问,输出一行询问结果。

数据范围
2≤n≤104,
1≤m≤2×104,
0<k≤100,
1≤x,y≤n
输入样例1:
2 2
1 2 100
1 2
2 1
输出样例1:
100
100
输入样例2:
3 2
1 2 10
3 1 15
1 2
3 2
输出样例2:
10
25

tarjan算法

a=input().split(' ')
n=int(a[0])
m=int(a[1])
e=[0]*(n*2+2)
ne=[0]*(n*2+2)
h=[-1]*(n+1)
w=[0]*(n*2+2)
value=[0]*(n+1)#存放每个节点与根节点的距离
p=[i for i in range(0,n+1)]#存放节点的祖先
st=[0]*(n+1)#节点标记数组,用于判断是否已经访问
res=[0]*(m)#存放结果数组
index=0
dict={}#存放查询
def add(a,b,c):global indexe[index]=b#存放的当前节点实际编号w[index]=c#存放a到b节点的权值ne[index]=h[a]#存放指针链,指向上一个位置h[a]=index#更新最后一个位置(也可以看为时链的头节点)index+=1
def dfs(r,fa):cnt=h[r]while cnt!=-1:nod=e[cnt]if nod!=fa:#如果当前节点不是父节点value[nod]=w[cnt]+value[r]#当前节点的值加上父节点的值dfs(nod,r)cnt=ne[cnt]
def find(x):if p[x]==x:return xp[x]=find(p[x])#可以进行路径压缩return p[x]def trajan(r):#初始访问,标记为在线st[r]=1#遍历所有子节点,判断是否进入在线状态,如果没有则标记为在线,并继续向下递归.注意结束后要将p更新cnt=h[r]while cnt!=-1:nod=e[cnt]if st[nod]==0:#如果没有访问就继续向下遍历trajan(nod)p[nod]=r#当前子节点的父节点为rcnt=ne[cnt]#遍历结束后执行查询if dict.get(r)!=None:#如果使用的是字典存放的在我们使用值之前,应该判断是否有值,否则会出现错误for item in dict[r]:if st[item[0]]==2:#已经回溯完成ll=find(item[0])#最近公共祖先res[item[1]]=value[r]+value[item[0]]-2*value[ll]#time[1]编号的查询值就为res[itme[1]]#标记为已经回溯完毕       st[r]=2
for i in range(0,n-1):strr=input().split(' ')x=int(strr[0])y=int(strr[1])v=int(strr[2])add(y,x,v)add(x,y,v)import queue
for i in range(0,m):strr=input().split(' ')x=int(strr[0])y=int(strr[1])dict.setdefault(x,[])dict.setdefault(y,[])dict[y].append([x,i])dict[x].append([y,i])dfs(1,-1)
trajan(1)
for i in range(0,m):print(res[i])

trajan算法(离线做法) LCA详解相关推荐

  1. 操作系统:基于页面置换算法的缓存原理详解(下)

    概述: 在上一篇<操作系统:基于页面置换算法的缓存原理详解(上)>中,我们主要阐述了FIFO.LRU和Clock页面置换算法.接着上一篇说到的,本文也有三个核心算法要讲解.分别是LFU(L ...

  2. 希尔排序基础java代码_java 算法之希尔排序详解及实现代码

    摘要:这篇Java开发技术栏目下的"java 算法之希尔排序详解及实现代码",介绍的技术点是"希尔排序详解.实现代码.希尔排序.Java.实现.代码",希望对大 ...

  3. kmeans python interation flag_机器学习经典算法-logistic回归代码详解

    一.算法简要 我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类.这里,用到了数学中的sigmoid函数,sigmoid函数的具体表达式和函数图象如下: 可以较为清楚的看到,当输入的x小于0 ...

  4. python实验原理_Python实现蒙特卡洛算法小实验过程详解

    蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯·诺伊曼,他在20世纪40年代中期用驰名世界的赌城-摩纳哥的蒙特卡洛来命名这种方法. 通俗的解释一 ...

  5. Matlab中的FCM算法代码及中文详解

    Matlab中的FCM算法代码及中文详解 转自:http://xiaozu.renren.com/xiaozu/106512/336681453 function [center, U, obj_fc ...

  6. 图解机器学习算法(6) | 决策树模型详解(机器学习通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/34 本文地址:https://www.showmeai.tech/article-d ...

  7. KMP算法之next数组详解

    KMP算法之next数组详解 KMP算法实现原理 KMP算法是一种非常高效的字符串匹配算法,下面我们来讲解一下KMP算如何高效的实现字符串匹配.我们假设如下主串和模式串: int i;//i表示主串的 ...

  8. 天津理工大学《操作系统》实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解

    天津理工大学<操作系统>实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解 实验内容 1. 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不 ...

  9. 算法经典“钓鱼”问题详解 基于贪心算法 C语言描述

    算法经典"钓鱼"问题详解 基于贪心算法 初始条件 在一条水平路边,有 n 2 ≤ n ≤ 25个钓鱼池,从左到右编号为1.2.3.--.n.小明有H1 ≤ H ≤ 16个小时的空余 ...

  10. SMART S7-200PLC流量累计算法实现(梯形图算法详解+优化)

    流量累计基于积分的原理,采用细分面积的方法近似计算瞬时流量的累加.离散上也就是累加求和.公式虽然简单但是流量累计仍有些需要注意的地方,下面一一和大家举例说明. 1.数值积分的通式 2.梯形积分公式 从 ...

最新文章

  1. 2021-2027年中国医疗护理行业深度研究及发展趋势报告
  2. [转]C++11 随机数学习
  3. SQL2008代理作业出现错误: c001f011维护计划创建失败的解决方法
  4. matlab v7.0,matlab下载-matlab免费版v7.0 官方版下载-6188手游网
  5. 【HDU4734】F(x) 数位DP
  6. 像素测量工具_翼眸科技利用无人机屋顶测量光伏行业应用
  7. iOS Block 知识点拾遗
  8. 3.10 十进制转换为二进制
  9. 记录腾讯云中矿机病毒处理过程(重装系统了fu*k)
  10. MAC修改保存bash_profile文件
  11. AI学习笔记(十)卷积神经网络
  12. 《游戏编程模式》一第7章 状态模式
  13. 爱奇艺开源的高性能网络安全监控引擎
  14. C++ Template用法总结
  15. Y的十年职业生涯小结(2012-2022)
  16. eclipse 中用svn共享项目
  17. 为什么有人劝别选计算机专业?
  18. leetcode 85. Maximal Rectangle(最大矩形)
  19. Oracle 数据库备份脚本
  20. 每日哲学与编程练习5——分数问题(Python实现)

热门文章

  1. 腾讯云产品介绍——腾讯云云服务器 CVM(Cloud Virtual Machine)
  2. 显卡虚拟化--最强实践
  3. 飞轮效应中的复利:相信时间的力量
  4. sublime html主题,2015 和 2016 最好 Sublime Text 3 主题
  5. win10文件索引服务器,Win10系统修改索引文件夹路径的方法
  6. word每个标题前都有个小黑点,怎么去掉?
  7. Word-去掉标题前面的小黑点
  8. python汇率换算注释_【菜鸟学Python】案例一:汇率换算
  9. 程序员经历过的最难调试的Bug是什么?
  10. 20种水彩画笔效果PS笔刷