1.割点,桥(割边)定义:
若v2(v1的后继节点)有且仅有反向边最远连接到v1,那么删除v1后不连通,v1是割点。作为一种特殊情况,如果v2及其后代通过反向边只能连回v2自己,那么只要删除edge(v1,v2)整个图就不连通了,那么edge(v1,v2)就是桥。
2.前提:
在DFS深搜树中:
3.定理 :
在无向图连通图G的DFS树中,非根节点v1是G的割点当且仅当v1存在一个子节点v2,使得v2及其后代都没有反向边连回v1的祖先,如果v1是根节点,当且仅当v1有两个以上子树的时候v1是割点
模版:
void DFS(int v1,int father)
{
int v2;
int child = 0; //child记录子树个数
dfn[v1] = low[v1] = ++dfsClock; //dfn[]记录DFS深度,low[]记录通过反向边最远到达的DFS深度,dfsClock对前两个数组元素初始化
vis[v1] = true; //vis[]记录是否遍历过,从而之后判断有无反向边
for(unsigned i = 0 ; i < G[v1].size() ; ++i){ //对当前点的邻接点进行遍历
v2 = G[v1][i];