口胡简单仙人掌图
- 我说的仙人掌必然不是你想的仙人掌
而这里的仙人掌和我们学过的树是一样的,是指一种特殊的图
而无向图仙人掌的定义是:任意一条边至多只出现在一条简单回路的无向连通图称为仙人掌
而有向图仙人掌不仅满足上面的条件还要满足整个图是一个强连通分量
从图中可以直观理解,可以说仙人掌就是多个环拼接形成的图(图片来源于网络)
下面我们就从有向图中的仙人掌入手研究,但是我们可能会发现很难下手,回忆起第一次看到树的时候,我们就想到:
我们不妨用 dfs 树来研究仙人掌
研究横向边是研究 dfs 树的突破点之一
但你想了一下,发现仙人掌图竟然没有横向边?
是的,有了横向边就一定不是仙人掌,那怎么证明呢?
首先整个图是一个强连通分量,那么横向边指向的那个点一定可以回到根节点
- 顺着回路回去的时候和这个红点的祖先(除了蓝点)不相交
- 顺着回路回去的时候和这个红点的祖先(除了蓝点)相交
显然这两种情况都导致有边成为了多个回路的一部分
- 性质1:有了横向边就一定不是仙人掌
回忆起学 tarjan 的经验,看一看 dfn 与 low(所有后代 dfn 最小值) 的关系,可以发现有
- 性质2:
low(u) \leq dfn(v) ,u 是v 的儿子
这两个性质可以成为仙人掌的判定了吗?还不行,看图:
设红点为
v ,图片来自网络
可以看到
可以看到
可以看到
所以还有性质3:若节点
判定完这三个性质就可以确定这个图是仙人掌(虽然不会证明)
-
\text{P5236 【模板】静态仙人掌}
圆方树是无向图,圆方树怎么构建呢(先讲维护的操作是两点间最短路
-
原图中的点都是圆点
-
对于每个环,新建一个方点;这个方点和环上其它圆点连成菊花图
-
对于不在环上的两个圆点,保留原图中的边
边权怎么敲定呢?
-
若
u,v 都是圆点,则权值为原图中边权 -
若
u 为方点,则权值为v 到u 的父亲的最短路 -
其他权值为
0
建好圆方树怎么搞呢?
求
我们先求出
如果
如果
可以看出来
胡一下为什么这个算法是对的呢?
我们穿过任何一个环,其距离都是预处理好的,是最小的,再处理环内的答案即可,而就对
x 为圆点的,由于交点无环,所以不用处理环内答案
说一些细节:
-
怎么求
U,V ,倍增求LCA附带求一求即可 -
怎么维护
dis(U,V) 因为这有两条路径,我们要求其中的min,怎么求呢?正着跑一次环,然后反方向再跑一次,维护差分即可