仙人掌

仙人掌

课程三要素:

1. Q
2. W
3. Q

1. 三分钟了解仙人掌

不是这个仙人掌!

u=3042208004,486407757&fm=26&fmt=auto (500×544) (baidu.com)

1.1 仙人掌的定义

定义仙人掌为:任意一条边最多只出现在了一条简单回路的无向、连通的图。

放图:

image-20211229164740506


13241.png (557×262) (luogu.com.cn)

第一个图是满足性质的。

第二个图不满足性质,因为点 2,点 3 出现在了两个环里。

第三个图不满足性质,因为图不连通。

1.2 仙人掌和树的联系

我们可以使用 tarjan 算法对仙人掌进行缩点(请注意这个缩点指的不是缩成一个点,而是将一个环缩成一个点!),这样就能得到一棵树。

1.3 仙人掌求两点之间的最短距离

对于一棵树而言,两点距离是唯一确定的,在 O(树的深度) 的时间复杂度内就可以求出。

当然也可以使用树上差分+ST表,tarjan 来求解。本例中不详细讲解。

对于一个仙人掌而言,两点距离是不唯一确定的,

这里我们就可以使用知识点 圆方树 来求解了!

那么如何将仙人掌转换成圆方树呢?

在这里插入图片描述

我们现在要将这一个仙人掌转化成圆方树。

在圆方树中,所有的边都是有向的。

我们先随便挑一个点作为圆方树的根节点。比如说 5 号节点。

在这里插入图片描述

对于任意的一个环,我们都可以在这一个环上找到一个点,使得这一个点距离根节点上的一个点最近。

比如说对于 1234 这一个环,4 号节点距离根节点 5 号节点是最近的,距离为 2

对于 678 这一个环,点 8 距离环最近,距离为 1

可以看下图,最近的点已经被加粗了。

在这里插入图片描述

下一步,将环变形。

我们任取一个环,比如说环 1234

在这里插入图片描述

我们对于上面的这一个环,建立一个方点 k

我们从头点 4 向方点 k 连一条边。

然后从方点 k 向其他的所有点,即 123 点各连一条边。

在这里插入图片描述

现在将这一个图改成从 4 号点连向 5 号点,k 号点连向 4 号点,123 号点连向 k 号点。

在这里插入图片描述

那么每一个边的权值改怎么定义呢?我们看一开始图的权值。

其中 4 号点向方点 k 连的边权为 0

然后对于其他的点,向 k 点连的边长为原来到 4 点的最短路径的长度。

在这里插入图片描述

这样我们就把这一个环拆分成了一个圆方树。

其他的环同理拆分,变成了这个样子:

在这里插入图片描述

posted @   yhbqwq  阅读(73)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示