一、割点和割边

  • 割点:在无向连通图中,删除一个顶点以及和它相邻的所有边,图中的连通分量个数增加,则该顶点称为割点
  • 割边(桥):在无向连通图中,删除一条边,图中的连通分量个数增加,则该条边称为割边或者桥

举个栗子:

割点:

无向图的双连通分量_割点

割边:

无向图的双连通分量_割点_02

二、边连通分量和点连通分量

  • 边双连通图:如果在无向图中不存在割边,则称它为边双连通图。在边双连通图中,任意两个节点之间都存在两条及以上的路径,并且这些路径上的边互不重复
  • 点双连通图:如果在无向图中不存在割点,则称它为点双连通图。在点双连通图中,如果节点数大于\(2\),则在任意两个节点之间都存在两条及以上路径,并且这些路径上的点互不重复
  • 边双连通分量:无向图的极大边双连通子图被称为边双连通分量,记作\(e-DCC\)。边双连通分量就是删掉桥(割边)之后所留下的连通块,连接两个边双连通分量的边就是桥
  • 点双连通分量:无向图的极大点双连通子图被称为点双连通分量,记作\(v-DCC\)

点双连通分量的性质:

  • 点双连通分量之间以割点连接,且两个点双连通分量之间有且只有一个割点
  • 每一个割点可以任意属于多个点双连通分量,因此求点双连通分量时,可能包含重复的点
  • 只有一条边连通的两个点也是点双连通分量

一张图无向连通图是“点双连通图”,当且仅当满足以下两个条件之一:

  • 图的顶点个数不超过\(2\)
  • 图中任意两点都同时包含至少一个简单环,其中“简单环”是指不自交的环,也就是我们通常画出的环。
  • 一张无向连通图是“边双连通图”,当且仅当任意一条边都包含在至少一个简单环中。

总结:

对于一个连通图,如果任意两点之间至少存在两条没有重复节点的路径,则称这个图为点双连通的(简称双连通);如果任意两点之间至少存在两条没有重复边的路径,则称该图为边双连通的。点双连通图的定义等价于任意两条边都同在一个简单环中,而边双连通图的定义等价于任意一条边至少在一个简单环中。对一个无向图,点双连通的极大子图称为点双连通分量(简称双连通分量),边双连通的极大子图称为边双连通分量。在每一个点双连通图中,内部无割点;在每一个边双连通图中,内部无桥。

举个栗子:

边双连通图:

无向图的双连通分量_割边_03

边双连通分量:

无向图的双连通分量_割点_04

点双连通图:

点双连通分量:

无向图的双连通分量_割点_05

三、求解割点和割边

割点判定法则

  • 如果\(x\)不是根节点,那么\(x\)是割点,当且仅当在搜索树上存在\(x\)的一个子节点\(y\),满足\(low[y] ≥ dfn[x]\)
  • 如果\(x\)是根节点,那么\(x\)是割点,当且仅当在搜索树上至少存在两个子节点\(y_i\),满足\(low[y_i] ≥ dfn[x]\)

先来看第一种,分为以下三个式子讨论:

如果\(low[y] > dfn[x]\),如下图所示:

无向图的双连通分量_割边_06

如果\(low[y] = dfn[x]\),如下图所示:

无向图的双连通分量_连通图_07

如果\(low[y] < dfn[x]\),如下图所示:

无向图的双连通分量_割边_08

综上可知,当\(low[y] ≥ dfn[x]\)时,才能说明节点\(x\)是一个割点

接着再来看第二种,分两种情况讨论:

如果\(x\)是根节点,但是它只有一个子节点:

无向图的双连通分量_连通图_09

如果\(x\)是根节点,但是它至少有两个子节点:

无向图的双连通分量_割边_10

割边判定法则

无向边\((x,y)\)是桥,当且仅当在搜索树上存在\(x\)的一个子节点\(y\),满足\(low[y] > dfn[x]\)

分为以下三个式子讨论:

当\(low[y]>dfn[x]\)时:

无向图的双连通分量_割点_11

当\(low[y]=dfn[x]\)时:

无向图的双连通分量_连通图_12

当\(low[y]<dfn[x]\)时:

无向图的双连通分量_连通图_13

综上,当\(low[y]>dfn[x]\)时,才能说明边\((x,y)\)是一条割边

注意,在无向图中,求割边时,孩子节点到父节点的边是不用处理的:

原因如下:

无向图的双连通分量_割点_14

四、成对变换

对于非负整数\(n\):

当\(n\)是偶数时,\(n\) \(XOR\) \(1\) 等于 \(n + 1\)

当\(n\)是奇数时,\(n\) \(XOR\) \(1\) 等于 \(n − 1\)

因此“\(0\)与\(1\)” “\(2\)与\(3\)” “\(4\)与\(5\)”⋯ 关于\(XOR\) \(1\) 运算构成了“成对变换

这一性质经常用于图论邻接表中边集的存储。在具有无向边的图中把一条正反方向的边分别存储在邻接表数组的第\(n\)与\(n + 1\)位置(其中\(n\)是偶数),那么就可以通过\(XOR\) \(1\)运算获得与当前边\((x,y)\)所反向的边\((y,x)\)的存储位置了(存储位置也就是这条边的编号)

如下图:

无向图的双连通分量_连通图_15

从中我们发现成对变换可以帮助我们在求割边时避免从子节点走回到父节点。

问题:如何理解割边的代码模板中的​​i!=(from^1)​​呢?

无向图的双连通分量_割边_16

五、总结

首先要明确各种定义,非常容易搞混:

  1. 时间戳:数组一般叫\(dfn[]\),记录点第一次入栈的顺序。
  2. 搜索树:\(dfs\) 时生成的树
  3. 割点:去掉这个点,原无向联通图不再联通。割点集合同理。
  4. 割边/桥:去掉这条边,原无向联通图不再联通。
  5. 点双联通图:不存在割点的图。判定:顶点数不超过2的无向联通图是点双。顶点数大于2的无向连通图是点双,当且仅当任意两点至少包含在一个简单环内。
  6. 边双联通图:不存在割边的图。判定:任意一条边包含在一个环内。
  7. 点双联通分量:极大点双联通图,即不存在包含这个点双联通子图的更大的双联通子图。
  8. 边双联通分量:同6,点改为边。
  9. 边双缩点:去掉割边,一个联通块缩成一个点。
  10. 点双缩点:点双缩成一个点,与割点连成图。
  11. 强连通分量的树边、前向边、后向边、横插边:1搜索树上的边,2连到子孙,3连到祖先,4连到不在同一棵子树的点。

六、【模板】边双连通分量

链接

七、【模板】点双连通分量

链接

八、好题练手

一、poj 2942

Knights of the Round Table

点双+奇环判定

二、poj 3694

Network

边双,low[]的并查集用法