BZOJ 2125 浅谈沙漠中的顽强植物仙人掌图TarJan点双连通构型改造LCA在线最短路

这里写图片描述
世界真的很大
这是今天的第三题,真的是
当时我反应过来是仙人掌的时候,大脑就闪过“沙漠中的顽强植物”
使用的方法很厉害,虽然可能比较超纲,但是的却算是学到了
思路理清用不了多久但是调试的时候由于对于点双连通分量的不熟悉所以说用了比较久的时间
今天一天怎么感觉又快莫名其妙的过去了啊
NOIP2017

看题先:

description:

给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径。

input:

输入的第一行包含三个整数,分别表示N和M和Q 下接M行,每行三个整数v,u,w表示一条无向边v-u,长度为w 最后Q行,每行两个整数v,u表示一组询问

output:

输出Q行,每行一个整数表示询问的答案

首先对于一张图来讲,肯定是不存在n^3以下的多原最短路的算法的,不然你让floyd怎么活
但是这道题偏偏就需要一个这样的算法,这当然是不可能的
于是乎只能考虑题目的性质比较特殊了。
每一条边只处于一个环里面。
这样的图叫做仙人掌图,至于为什么,大概是由于画出来比较像仙人掌吧
观察发现这样的图其实就是一棵树上有一些环而已
如果没有这些环只是一棵树的话是很简单的,只需要记录每个点到根的距离询问时求lca加加减减就行了
那么对于这个类似树的仙人掌图我们也进行同样的操作,记录每个点到根(设为1)的距离,当然是记录最短距离了,这个可以用SPFA单源最短路预处理出来
发现只要这样记录之后,加加减减好像的确是可以的
那么问题就变成了如何求lca,因为这是一张无向图对吧,尽管长的和树差不多但是毕竟不一样,肯定不能处理Lca什么的
考试时就在这里卡住了

这个就是仙人掌图才能做到的操作了
对于树上的每一个环,我们改变他的构造
取环上深度(即离1最近)最浅的点来”代表“这个环
环上其余所有点向这个点连边,这样就把原图转化成一棵树了
注意的是这棵树的实际含义近乎于没有,单单是为了访问lca而存在的构型转化模式
其避免了lca无法处理环的情况,如果两个点在访问lca的时候,一个环只是经过了u到lca或者v到lca的路径上的话完全不影响对吧
如果正好在lca的位置的话就假设是环上最上面的一个点是lca
这一步就是这么一个模型转化而已
所以说这个新树并不是什么东西,上面的边也没有边权,加加减减还是按照之前的最短路来做
然后就是为什么只有,或者说仙人掌图可以这样做,而一般的图不行
原因就在于仙人掌图的所有环都是简单环,不会有复环的情况出现
这样对于每一个环内的点当指定了根之后就有唯一的”深度最浅“的点来连边进而转化成一棵树了

这一步,由于这些环都是点双连通(一条边不在两个环里),所以可以用点双连通的tajan求到

值得注意的是点双连通分量由于一个点可能处于多个点双连通分量里,所以tarjan的时候是将边压进栈里面
而压边的时候一定要注意方向,同一条边不要正反两次都压进去。这是因为搜索的顺序不同导致这两条一样的边在栈里面的位置可能会被割点的连边分开,这样就无法再一个点双连通里面弹出,会遗留在下一个点双连通分量的弹栈里面

但是我们发现,对于每一个lca不在一个环里面的u,v这样做是没有问题的,但是当lca处于一个环里面的时候就不对头了
因为在一个环里面,就有两条路可以走(环的上半部和下半部),而如果我们这样选,相当于就默认走上半部,但完全有可能下半部更优
所以在这种情况的时候,我们就需要比较&

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值