无向图的割点和桥
在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多,就称这个点集为割点集合。
如果某个割点集合只含有一个顶点X(也即 {X} 是一个割点集合),那么X称为一个割点。
设G是一个图,x是G的一条边,如果G-x的连通分支数大于G的连通分支数,则称x是G的一个桥,或割边。
双连通分量又分点双连通分量和边双连通分量两种。
若一个无向图中的去掉任意一个节点(一条边)都不会改变此图的连通性,即不存在割点(桥),则称作点(边)双连通图。一个无向图中的每一个极大点(边)双连通子图称作此无向图的点(边)双连通分量。
求双连通分量可用Tarjan算法。
点双连通分量和边双连通分量
若一个无向图中的去掉任意一个节点都不会改变此图的连通性,即不存在割点,则称作点双连通图。一个无向图中的每一个极大点双连通子图称作此无向图的点双连通分量。
注意一个割点属于多个点双连通分量。
若一个无向图中的去掉任意一条边都不会改变此图的连通性,即不存在桥,则称作边双连通图。一个无向图中的每一个极大边双连通子图称作此无向图的边双连通分量。
连接两个边双连通分量的边即是桥。
边双连通分量:可将其看做一棵树或者森林,节点为边双连通分量,树边为桥。
边双连通分量和点双连通分量的区别与联系
- 二者都是基于无向图
- 边双连通分量是删边后还连通,而后者是删点
- 点双连通分量一定是边双连通分量(除两点一线的特殊情况),反之不一定
- 点双连通分量可以有公共点,而边双连通分量不能有公共边
代码
Tarjan算法求无向图的割点
邻接表存图,输入为 n n n 、 m m m 表示 n n n 个点 m m m 条边,接着输入 m m m 条边,输出第一行为割点的个数,然后一行为割点的编号。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int N = 2e4 + 10;
int n, m, root;
vector<int> e[N]; //邻接表存图
int num[N], low[N], idx;
bool flag[N];
void dfs(int cur, int father) {