点双边双学习笔记
写在前面
经过 NOIp2022 的惨痛失败后,我重新学习了一下点双边双,特发此学习笔记以告诫自己以后不要忽视图论
前置知识
- 割点:在无向图中,去掉一个点和所有与他相连的边,使得当前图不是强连通分量(\({\rm low}_v \ge {\rm dfn}_u\) 或 \(u=root,sizson_u \ge 2\))。
- 割边:在无向图中,去掉一条边,使得当前图不是强连通分量。
点双
定义
点双联通:没有割点的图。
点双联通分量:无向图的极大点双联通子图被称为点双联通分量。
条件
- 图的顶点数不超过 2.
- 图中任意两个点都同时包含在至少一个简单环中(不自交)
性质
-
除了仅包含两个点一条边的点双外,其他点双都满足:任意两点间都存在至少两条点不重复路径。
-
图中任意一个割点都在至少两个点双。
-
两个点双至多存在一个公共点——割点。
-
任意一个不是割点的点都只存在于一个点双中,割点也一定属于两个及以上的点双。
模板
找到一个新的割点 \(u\),就找到一个新的点双分量,将 \(v\) 以上的元素全部弹出,这是一个点双分量。
dfn[u]=low[u]=++tim; s[++top]=u;
if(u==root&&!head[u]) return v[++cnt].emplace_back(u);
For(i,u)
{
if(!dfn[e[i].v])
{
tarjan(e[i].v);
low[u]=min(low[u],low[e[i].v]);
if(low[e[i].v]>=dfn[u])
{
v[++cnt].emplace_back(u);
while(1)
{
v[cnt].emplace_back(s[top--]);
if(s[top+1]==e[i].v) break;
}
}
}
else low[u]=min(low[u],dfn[e[i].v]);
}
边双
定义
边双联通:不存在割边。
边双联通分量:无向图的极大边双联通子图。
定理
一张无向图时“边双连通图”,当且仅当任意一条边都包含在至少一个简单环中。
模板
只需求出无向图中所有的桥,把桥都删除后,无向图会分成若干个连通块,每一个联通块都是一个“边双连通分量”。

浙公网安备 33010602011771号