点双边双学习笔记

写在前面

经过 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]);
}

边双

定义

边双联通:不存在割边。

边双联通分量:无向图的极大边双联通子图。

定理

一张无向图时“边双连通图”,当且仅当任意一条边都包含在至少一个简单环中。

模板

只需求出无向图中所有的桥,把桥都删除后,无向图会分成若干个连通块,每一个联通块都是一个“边双连通分量”。

posted @ 2022-12-16 09:18  starrylasky  阅读(41)  评论(0)    收藏  举报