tarjan解决路径询问问题

好久没更新了,就更一篇普及组内容好了。

首先我们考虑如何用tarjan离线求出lca,伪代码大致如下:

def tarjan(x):
  将x标记为已访问
  for c in x的孩子:
    tarjan(c)
    将c所在并查集的父亲置为x
  for q in 关于x的询问:
    y=询问q除了x外的另一个端点
    if y已访问:
      q的答案=y所在并查集的根

这样为什么是对的呢?考虑lca肯定是先搜到y,再搜到x,因为此时lca还没有做完,所以此时并查集的根就是lca,而且y已经和lca并在一起了,所以会询问到正确的结果。

现在我们要用tarjan来解决路径询问问题,例如每条边有边权,若干次询问,询问路径上的边权和。

首先我们要在并查集上动一些手脚,原来并查集只是用来查询祖先,我们在并查集每个点上记一个额外信息,为这个点到并查集根的信息,在本题中即为该点到根的边权和。在查询祖先时我们可以顺便更新这个信息。

查出lca时我们把这个询问扔进lca,把它称作“延迟询问”,回到lca的时候遍历所有延迟询问,这时候x和y在并查集中的祖先都是lca,直接合并信息即可。

ff=一个初始为0的数组储存并查集
info=一个初始为空的数组储存信息
def find(x):
  if !ff[x]:
    return x
  y=ff[x]
  ff[x]=find(y)
  info[x]=info[x]+info[y]
  return ff[x]
def tarjan2(x):
  将x标记为已访问
  for c in x的孩子:
    tarjan2(c)
    ff[c]=x
    info[c]=c到x的边的信息
  for q in 关于x的询问:
    y=询问q除了x外的另一个端点
    if y已访问:
      q的lca=y所在并查集的根
      在q的lca处插入延迟询问q
  for q in x为lca的延迟询问:
    (a,b)=该询问的两个端点
    find(a)
    find(b)
    q的询问结果=info[a]+info[b]
时间: 2024-10-03 21:24:02

tarjan解决路径询问问题的相关文章

VBS中解决路径带空格的三种方法

vbs中,如果需要运行的程序中带有空格,按照通常的方式往往会提示错误,其实有两种形式不同的解决方法: 在应用程序前后分别加三个双引号,代码如下: [c-sharp] view plaincopyprint? Set wshell=CreateObject("WScript.Shell") wshell.Run  """C:/Program Files/360/360se/360se.exe""",5,True Set wshe

MVC-Razor视图引擎及解决路径问题的三个方法

Razor 视图引擎 与Aspx开发区别在于代码: 1.Razor 更智能,摒弃了<%%>格式,直接用@符号开启cs代码,遇到html时自动识别 2.遇到如汉字等即非cs代码,又非html代码就无法识别,由"@:"或"<text></text>"来输出 Razor格式: 1.基本代码以"@"开启cs代码,一行内为cs代码 2."@{}"表示花括号内都是cs代码 3."@:"

基于thinkphp开发的项目部署到由宝塔面板创建的LNMP服务器上解决路径出错问题

一. 环境与版本: 主机:amazon aws EC2主机 系统:Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-1039-aws x86_64) 面板:宝塔免费版 6.9.5 服务:Nginx 1.16, PHP 7.2, MySQL 5.7.22(运行在amazon的RDS上,没通过宝塔面板安装,本文讨论内容不涉及数据库) 程序:ThinkPHP 5.0.24 二. 部署过程 1. 在云端开通并启动主机,做一点点必要的升级和小配置(省略,找主机商网站). 2. 登录

pod导入融云路径报错解决办法

build Settings中搜索sear Search Patchs下点开Library Search Paths 将$(inherited)"$(SRCROOT)/Pods"分开来写 第一行$(inherited) 第二行"$(SRCROOT)/Pods" 这样可以解决路径报错的问题.希望对各位有所帮助

解决Java工程路径中含有中文的情况

问题: 当Java工程路径中含有中文时,得不到正确的路径 *** 解决: 这其实是编码转换的问题.当我们使用ClassLoader的getResource方法获取路径时,获取到的路径被URLEncoder.encode(path,"utf-8")编码了,当路径中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要的真实路径,所以我们可以调用URLDecoder.decode()方法进行解码,以便得到原始的中文及空格路径. Java代码 : String package

hdu--2586--lca_tarjan&lt;证明tarjan这个人很流弊&gt;

开篇 敬仰下 大师-tarjan 发明的这些算法太流弊了=-=使用这个lca_tarjan之前 可以先去学习下使用tarjan解决scc强连通问题 我本来是去做到hdu-4912-发现做不来=-= 去网上搜了下 都说是神马lca的....那就去学下吧 而且很多也将这题当做入门题.. lca分离线和在线 这边我介绍的是离线算法 是要先将所有的询问一起处理 而不是单个单个地去处理  处理完成之后 你自己选择一种方式将答案存储下来 然后再进行一遍输出答案 我再网上没有找到一篇好的博客来推荐给大家 所以

解决manjaro 登录时“login failure”

问题描述:开机后输入密码提示登录失败 解决路径 使用root用户登录(失败),怀疑是桌面环境问题,通过ctr+alt+4进入tty4进行登录(失败) 修改密码 通过liveCD模式修改密码,步骤如下 a) 通过启动盘进入manjaro系统 b) 通过fdisk -l查看硬盘挂载情况 c) 将根目录挂在到/media/manjaro挂在点上 mount /dev/sda1 /media/manjaro d) 改变root设置密码 chroot /media/manjaro passwd root

php 相对路径中 及 绝对路径中 的一些问题

写本篇文章,是为了以后学习中遇到问题好解决 php的相对路径是以当前工作目录为基准的,并不是以当前处理的文件目录为基准,这样导致我们在开发过程中总会遇到一些问题. 但是如果我们使用绝对路径,就会导致后期的项目移植,以及可维护性较差. 在使用include以及requice包含文件的时候,在文件路径前都加上dirname(__FILE__)可解决路径问题 dirname(__FILE__)获取当前文件的目录路径 ps: 当前有四个文件,分别为a.php,b.php,c.php,d.php 他们之间

PHP 站点相对包含,路径的问题解决方法(include,require)

以前看了,很多框架,基本上很少使用相对路径包含.而一般很多做php web站点,喜欢用相对路径. 认为这样,无论目录放到那里. 只要跟另外目录关系一致.那么就不会出现问题.如果一个站点,一般都认为,如果用根目录,经常会改变网站地址,觉得很不方便.其实,我们从各大常见框架里面会发现,基本上都是采用是绝对路径方法. 相对路径带来问题 我们有如下结构的目录. <web>(网站根目录) ├<a>文件夹 │ │ │ └a.php ├<b>文件夹 │ │ │ └b.php └tes