边双连通分量——学习(复习)笔记

来源:互联网 发布:淘宝设置客服分流没用 编辑:程序博客网 时间:2024/06/05 11:52

一年前学过边双,而然一直没怎么用过,忘完了(我真是菜),来补一发。

一些概念

如果任意两点至少存在两条边不重复路径,则称该图为边双连通的
边双连通的极大子图称为边双连通分量
桥是指当删去这个边时,连通块的数量会增加
边双连通分量中不存在桥

算法

就是 Tarjan 的那套 dfs 树+时间戳的搞法。
先求出所有桥,原图中的桥删去后的子图,每一个联通块都是一个双连通分量。
下面是求桥

void Tarjan(int x,int pre){    dfn[x]=low[x]=++Tim;    for(int j=fir[x];j;j=nxt[j]){        if(!dfn[son[j]]){            Tarjan(son[j],x);            low[x]=min(low[x],low[son[j]]);            if(low[son[j]]>dfn[x]) isbridge[j]=isbridge[j^1]=true;        }        else if(dfn[son[j]]<dfn[x]&&son[j]!=pre) low[x]=min(low[x],dfn[son[j]]);    }}

复杂度线性