一年前学过边双,而然一直没怎么用过,忘完了(我真是菜),来补一发。
一些概念
如果任意两点至少存在两条边不重复路径,则称该图为边双连通的
边双连通的极大子图称为边双连通分量
桥是指当删去这个边时,连通块的数量会增加
边双连通分量中不存在桥
算法
就是 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]]);
}
}
复杂度线性