首页/数据结构/05-graph/图的连通性判断 🔗 在 Obsidian 中打开
数据结构 · 05-graph

图的连通性判断

难度 ★★★重要度 ★★ 考查频率 低题型 选择 / 简答 数据结构/图连通性DFSBFS
速查
判连通只需一次 DFS/BFS 看是否访问到全部顶点;连通分量个数 = DFS 调用次数。$n$ 顶点连通图最少 $n-1$ 条边,非连通图最多 $(n-1)(n-2)/2$ 条边

速查

项目
主题图的连通性判断
核心方法方法一:DFS / BFS;方法二:邻接矩阵的幂
时间复杂度暴力判强连通 $O(n(n+e))$
难度⭐⭐⭐

核心概念

基本术语

  • 连通:无向图中,从顶点 $u$ 到顶点 $v$ 有路径,则称 $u$ 和 $v$ 是连通的
  • 连通图:无向图中任意两个顶点都连通
  • 连通分量:无向图的极大连通子图
  • 强连通图:有向图中任意两个顶点 $u \to v$ 和 $v \to u$ 都有路径
  • 强连通分量:有向图的极大强连通子图

连通图的边数条件

条件说明
$n$ 个顶点的连通图最少边数$n-1$(树)
$n$ 个顶点的非连通图最少边数0
$n$ 个顶点的连通图最多边数$n(n-1)/2$(完全图)
$n$ 个顶点的非连通图最多边数$(n-1)(n-2)/2$(一个孤立点 + 完全图)

关键性质

无向图连通性判断

方法一:DFS / BFS

从任意一个顶点出发做 DFS 或 BFS:

  • 如果遍历到的顶点数 = 图的顶点总数 → 连通
  • 否则 → 不连通

统计连通分量个数

int count = 0;
for (int i = 0; i < n; i++) {
    if (!visited[i]) {
        DFS(G, i);
        count++;  // 每次调用 DFS 发现一个新的连通分量
    }
}
// count 就是连通分量的个数
// count == 1 表示连通图

方法二:邻接矩阵的幂

  • 计算 $A + A^2 + A^3 + \cdots + A^{n-1}$
  • 如果结果矩阵所有非对角线元素都 $> 0$ → 连通
  • 实际考试中不会这样算,仅作理论了解

有向图强连通性判断

方法一:暴力法

对每个顶点做 DFS,检查是否能到达所有其他顶点。时间复杂度 $O(n(n+e))$。

方法二:Kosaraju 算法

  1. 对原图 $G$ 做 DFS,记录完成时间(后序遍历顺序)
  2. 求原图的转置图 $G^T$
  3. 按完成时间的逆序对 $G^T$ 做 DFS
  4. 每次 DFS 遍历到的顶点构成一个强连通分量

方法三:Tarjan 算法

利用 DFS 树和,在一次 DFS 中找出所有强连通分量。核心概念:

  • dfn[u]:顶点 $u$ 的 DFS 序号
  • low[u]:顶点 $u$ 能回溯到的最早祖先的 dfn 值
  • dfn[u] == low[u] 时,$u$ 是强连通分量的根

连通图与生成树

  • 生成树:连通图的极小连通子图,包含所有顶点和 $n-1$ 条边
  • 生成森林:非连通图的各连通分量的生成树组成生成森林

手算示例

示例一:判断无向图连通性

题目:无向图有 5 个顶点,邻接矩阵如下,判断是否连通。

    A  B  C  D  E
A [ 0  1  1  0  0 ]
B [ 1  0  0  1  0 ]
C [ 1  0  0  0  0 ]
D [ 0  1  0  0  0 ]
E [ 0  0  0  0  0 ]

分析:从 A 出发 DFS:A → B → D → C(访问了 4 个顶点)。E 没有被访问到,所以不连通

连通分量:$\{A, B, C, D\}$ 和 $\{E\}$,共 2 个连通分量

示例二:统计连通分量

题目:无向图如下,求连通分量个数。

1 — 2    4 — 5
|          |
3          6 — 7
                8

分析

  • 从 1 出发 DFS:访问 1, 2, 3 → 连通分量 1
  • 从 4 出发 DFS:访问 4, 5, 6, 7 → 连通分量 2
  • 从 8 出发 DFS:访问 8 → 连通分量 3

连通分量个数:3

示例三:判断有向图强连通性

题目:有向图如下,判断是否强连通,求强连通分量。

A → B → C → A
        ↓
        D → E → D

分析

  • A, B, C 构成环:A→B→C→A,互相可达 → 强连通分量 $\{A,B,C\}$
  • D, E 构成环:D→E→D,互相可达 → 强连通分量 $\{D,E\}$
  • 整个图不是强连通的(C 可达 D,但 D 不可达 A)

示例四:非连通图最多边数

题目:6 个顶点的非连通无向图最多有多少条边?

分析:非连通图最多边数 = 一个孤立点 + 其余 $n-1$ 个点构成完全图。

$$E_{max} = \binom{n-1}{2} = \binom{5}{2} = 10$$

常见考法

题型一:判断连通性给定邻接表或邻接矩阵,判断图是否连通。
题型二:求连通分量个数给定图,用 DFS/BFS 求连通分量个数。
题型三:边数与连通性$n$ 个顶点至少 / 至多多少条边才能保证连通 / 不连通。
题型四:生成树连通图的生成树有多少条边?不连通图的生成森林呢?

易错点

注意
  1. 连通分量是极大连通子图:"极大"意味着不能再加入任何顶点。
  2. 有向图的连通和强连通不同:连通只需单向可达,强连通需要双向可达。
  3. $n$ 个顶点的非连通图最多 $(n-1)(n-2)/2$ 条边:不是 $n(n-1)/2$。
  4. 生成树是极小连通子图:"极小"意味着去掉任意一条边就不连通。
  5. 连通分量个数 = DFS 调用次数

核心结论

性质
$n$ 顶点连通图最少边$n-1$
$n$ 顶点非连通图最多边$(n-1)(n-2)/2$
无向图连通性判断DFS/BFS 一次遍历是否访问所有顶点
连通分量个数DFS 调用次数
生成树边数$n-1$($n$ 为连通图顶点数)

记忆卡片

如何判断无向图是否连通?
从任意顶点出发做 DFS 或 BFS,如果遍历到的顶点数等于图的顶点总数,则连通。
$n$ 个顶点的非连通无向图最多多少条边?
$(n-1)(n-2)/2$。即一个孤立点加上 $n-1$ 个顶点的完全图。
连通分量和生成树有什么区别?
连通分量是极大连通子图(边尽可能多);生成树是极小连通子图($n-1$ 条边)。
有向图的连通和强连通有什么区别?
连通只需单向可达;强连通需要 $u \to v$ 和 $v \to u$ 都有路径。
如何统计无向图的连通分量个数?
遍历所有顶点,对未访问的顶点调用 DFS,DFS 调用次数就是连通分量个数。
Tarjan 判定强连通分量根的条件?
dfn[u] == low[u] 时 $u$ 是该强连通分量的根。

交互动画 · 连通分量计数

1 2 3 4 5 6 7 8 每次从一个未访问顶点调用 DFS,即发现一个新的连通分量
点击「播放」或「下一次 DFS」开始统计连通分量
count = 0 visited = { }
示意图:该图共 8 个顶点、5 条边,DFS 需被调用 3 次 → 连通分量个数为 3,因此该图不连通

相关知识点

(暂无关联知识点)

↑ 本页右上「在 Obsidian 中打开」可跳回源笔记。