圆方树学习笔记
定义
圆方树是一种用于刻画无向图点连通性的手法,其精确的刻画了无向图中点双结构,用于简化问题。
边双缩点之后,可以发现此时我一个无向连通图已经变成了一棵树,拥有非常好的性质。但是点双缩点之后,由于点双是由点链接的,形成了一个神秘的结构,若直接把割点看作是一个边就太草率了,因为有可能有多个点双通过一个点链接。这样就难以处理了。
因此我们考虑把点双中的每个点都连向一个虚拟节点,我们称这个节点为方点,原图中的节点为圆点。那么一个方点可以连向多个圆点,一个圆点也可以连向多个圆点,这样交替进行,就形成了一个树形结构,我们称这棵树为圆方树。
写代码的时候有几个注意事项:
-
特判孤立点。
-
我们不需要特判根节点以及把栈中的点单独作为一个点双,因为根节点的每个儿子都会把根节点判定为割点,这样他们就会组成一个一个的点双,刚好不重不漏。
构建代码:
qwq
void form(int cut, int rt){ int id = ++tot; G[id].pb(cut); G[cut].pb(id); do{ G[id].pb(stk[top]); G[stk[top]].pb(id); out[id] }while(stk[top--] == rt); } void build(int u){ low[u] = dfn[u] = ++dfc; stk[++top] = u; for(int i = head[u]; i; i = edges[i].next){ int v = edges[i].v; if(!dfn[v]){ build(v); chkmin(low[u], low[v]); if(low[v] == dfn[u]) form(u, v); } else chkmin(low[u], dfn[v]); } }
一些常见结论:
-
大小大于
的点双每个点一定被一个大小 的简单环包含。- 推论:大小大于等于三的点双一定是边双。
-
有边相连的两个点的点连通性一定相同。
- 因此,可以定义一条边 “所属的点双”,结合性质
可知,一条边为割边当且仅当这条边所属的点双大小为 。
- 因此,可以定义一条边 “所属的点双”,结合性质
-
两个点的简单路径上的必经点就是圆方树上两个点简单路径中包含的圆点。
- 事实上,这个也是圆方树构建的初衷。
-
一个点为割点等价于该圆点在圆方树上不是叶子。
本文作者:Little_corn
本文链接:https://www.cnblogs.com/little-corn/p/18720648
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」