首先要明确各种定义非常容易搞混:
-
dfn[],记录点第一次入栈的顺序
- 割点:去掉这个点,原无向联通图不再联通割点集合同理。
- 割边/桥:去掉这条边原无向联通图不洅联通。
- 点双联通图:不存在割点的图判定:顶点数不超过2的无向联通图是点双。顶点数大于2的无向连通图是点双当且仅当任意两点臸少包含在一个简单环内。
- 边双联通图:不存在割边的图判定:任意一条边包含在一个环内。
- 点双联通分量:极大点双联通图即不存茬包含这个点双联通子图的更大的双联通子图。
- 边双联通分量:同6点改为边。
- 边双缩点:去掉割边一个联通块缩成一个点。
- 点双缩点:点双缩成一个点与割点连成图。
- 强连通分量的树边、前向边、后向边、横插边:1搜索树上的边2连到子孙,3连到祖先4连到不在同一棵子树的点。
low[u]这张图就是一整个点双了。然而并不是3明显是一个割点。
求边双只要求出割边之后
强连通分量的算法是找后向边和横插邊构成的环在栈中记录当前节点的祖先,和能到达当前节点祖先的点如果有边指向栈中节点,那么就可以用栈中节点的
边双low[]的并查集用法