1、无向图的连通性
连通分量:无向图中,互通的点组成一个连通分量;
性质:所有点都可以互相到达;
割点:将此点删除,会产生至少两个连通分量;
割边:将此边删除,会产生至少两个连通分量;
双连通分量:
点双连通分量:任意两点之间存在至少两条“点不重复”的路径;
边双连通分量:任意两点之间存在至少两条“边不重复”的路径;
性质:点双一定是边双,(充分不必要,除两点一线的特殊情况,此时是点双,但不是边双);
因为不同点之间的边一定不同,不同边所连的点可能相同;
2、有向图的连通性
强连通图:任意两点可以互相到达;
强连通分量:图不是强连通图,将其分为多个子图,子图内部强连通,且已经扩展到最大,这样的子图为强连通分量。
3、tarjan
一般用tarjan算法解决连通问题;
割点,割边:
dfn:时间戳,即dfs的访问顺序;
low[x] : x及其后代所能到达的所有点中最小的dfn;
num[x] : 记录x的时间戳;
注意dfs后,所有点以树的形式储存,可能存在回退边将子代与祖先相连;
记v是x的子节点;
显然当存在low[v] >= num[x]时,x是割点,因为v及其子代最多只能到x,无法到达x的祖先;
显然low[v] > num[x]时,v到x的这条边是割边,因为v及其子代只能通过v到x这条边到x,将此边删除,出现更多的连通分量;
特殊情况是根结点,当且仅当根节点有至少两个子结点时,才是割点,这是因为根节点的low值永远最小,注意这里的子结点是指树上的子结点,而不是在图上根结点直接连接的点;
点双,边双:
两个点双最多只有一个公共点,这个点是割点,同样,一个割点至少连接两个点双;在求解割点时就已经访问了一个点双,可以将访问的边储存在栈中,每当找到一个割点,就将栈中的所有边弹出,注意不能储存点,因为割点可以属于不同的点双,储存点会使割点只能存在于一个点双之中。
所有low值相同的点在一个边双里面,不同边双之间没有公共边;这是因为,边双里面所有点都可以从一个点出发并再次到达该点,而这个起始点与他父亲的连边是个桥。注意该起始点可以是割点;