仙人掌

仙人掌

课程三要素:

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 仙人掌求两点之间的最短距离

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

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

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

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

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

在这里插入图片描述

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

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

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

在这里插入图片描述

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

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

对于 \(6\)\(7\)\(8\) 这一个环,点 \(8\) 距离环最近,距离为 \(1\)

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

在这里插入图片描述

下一步,将环变形。

我们任取一个环,比如说环 \(1\)\(2\)\(3\)\(4\)

在这里插入图片描述

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

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

然后从方点 \(k\) 向其他的所有点,即 \(1\)\(2\)\(3\) 点各连一条边。

在这里插入图片描述

现在将这一个图改成从 \(4\) 号点连向 \(5\) 号点,\(k\) 号点连向 \(4\) 号点,\(1\)\(2\)\(3\) 号点连向 \(k\) 号点。

在这里插入图片描述

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

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

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

在这里插入图片描述

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

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

在这里插入图片描述

posted @ 2021-12-29 17:49  yhbqwq  阅读(63)  评论(0编辑  收藏  举报