Skip to content

2.6 图

计算机程序设计 · 数据结构 · 2.6 图(零基础讲义)

🎯 一句话秒杀:图是 多对多 的结构——顶点之间的关系是任意的。遍历图需要记录"访问过"的顶点(不然会死循环)。


① 📊【历年真题考情】

本章(图)在广东专升本计算机统考中的位置:

项目结论
出题频次⭐⭐⭐⭐——2026 考纲全解标注"图:单选、填空、计算,约10分";图的遍历与存储 2/4 年(2023 实考)
常考题型单选、填空、计算大题(Prim/Kruskal/DFS 序列)、简答
预估分值8~18 分 / 200 分(单选+填空+计算大题,树图合计约 18 分)
考纲归属2026 考纲「非线性结构」考点16(存储、遍历、最小生成树、最短路径)

考场真实出现过的高频题:

  • 2024 填空5:9 个顶点的连通图最少需要 8 条边(n-1)
  • 2024 简答4:有向图的出度/入度定义(Σ出度=Σ入度=边数,10 分)
  • 2021 大题45:Prim 最小生成树(以结点 1 为起点)
  • 2022 大题:从 1 开始 DFS(邻接点升序)写访问序列 + Prim/Kruskal 最小生成树并画树
  • 2023:图的遍历(DFS)

🎯 学习目标:学完本章,你能 ① 手算 DFS/BFS 访问序列;② 手算 Prim(加点法)和 Kruskal(加边法)最小生成树;③ 说出度/入度/连通边数公式;④ 选对存储结构——尤其是 2021/2022 两道手算大题,必须会一步步画


② 🗣️【零基础大白话引入】

图是什么? 图就是一群点 + 连接它们的线。你手机里的地图导航——城市是"顶点",道路是"边";微信好友关系——每个人是顶点,"认识"就是边。图研究的就是"点和点之间怎么连"。

三个生活化比喻:

  • DFS(深度优先) = 走迷宫,一条道走到黑,走不通再退回来换一条——"先深后广"
  • BFS(广度优先) = 波浪扩散,先看所有"一步能到"的,再看"两步能到"的——"逐层展开"
  • 最小生成树 = 给几个村庄修路,要求连通所有村且总路费最少——这就是 Prim/Kruskal 干的事

为什么是考试重点? 因为图的题"会画就会做"——手算最小生成树手写遍历序列是计算大题的常客(2021、2022 都考了),把画图过程练熟,10-20 分就到手。

💡 本章主线:术语(怎么描述图)→ 存储(怎么存图)→ 遍历(怎么走图)→ 最小生成树(怎么连图)→ 最短路径/拓扑(图的进阶应用)


③ 📖【正式核心知识点讲解】

本章知识点 = 考纲要求 + 历年真题实际考过的内容。

3.1 图的定义与术语

图的定义

图 G = (V, E)
V:顶点的非空有限集合
E:边的有限集合

基本术语

术语定义
有向图边有方向(弧)
无向图边无方向
完全图任意两个顶点间都有边
与顶点关联的边数
入度有向图中指向该顶点的弧数
出度有向图中从该顶点出发的弧数
连通图任意两顶点间都有路径
生成树连通图的极小连通子图(n个顶点,n-1条边)

🔑 秒杀秘籍(2024 填空5 / 简答4 必考)

完全图边数公式(必背!):

  • 无向完全图:n(n-1)/2 条边
  • 有向完全图:n(n-1) 条边(每对顶点两条方向相反的弧)

度与边的关系:

  • 无向图:所有顶点的度之和 = 2 × 边数
  • 有向图:入度之和 = 出度之和 = 边数

2024 填空5:9 个顶点的连通图最少需要 8 条边(n 顶点连通最少 n-1 条边,形成树) ✅ 2024 简答4(10 分):有向图 = 顶点集 + 边集(有序对 <v,w>);出度 OD(v)=以 v 为弧尾的弧数;入度 ID(v)=以 v 为弧头的弧数;Σ出度=Σ入度=边数

3.2 图的存储

3.2.1 邻接矩阵(顺序存储)

c
#define MAXVEX 100
typedef struct {
    int edges[MAXVEX][MAXVEX];  // 邻接矩阵
    int n, e;                    // 顶点数、边数
} MGraph;
无向图邻接矩阵(对称矩阵):
    A B C D
A [[0,1,1,0],
B  [1,0,0,1],
C  [1,0,0,1],
D  [0,1,1,0]]

特点:无向图对称,有向图不一定对称
特点说明
优点判断任意两点是否有边 — O(1)
缺点存储空间 O(n²) — 稀疏图浪费大

3.2.2 邻接表(链式存储)

c
typedef struct EdgeNode {      // 边结点
    int adjvex;                // 邻接点下标
    struct EdgeNode *next;     // 下一条边
} EdgeNode;

typedef struct {               // 顶点结点
    int data;                  // 顶点信息
    EdgeNode *firstedge;       // 第一条边
} VertexNode, AdjList[MAXVEX];

typedef struct {
    AdjList adjlist;           // 顶点数组
    int n, e;                  // 顶点数、边数
} ALGraph;
邻接表(无向图):
A → B → C
B → A → D
C → A → D
D → B → C

特点:边数 = 链表结点数/2(无向图每条边存两次)
特点说明
优点节省空间(稀疏图),找邻接点快
缺点判断两点是否有边需要遍历链表

3.2.3 邻接矩阵 vs 邻接表(2022 单选关联)

比较邻接矩阵邻接表
空间O(n²)O(n+e)
适用场景稠密图稀疏图
判断两点相连O(1) ✅O(度)
找所有邻接点O(n)O(度) ✅

💡 记忆:稠密用矩阵(判断快),稀疏用链表(省空间)

图的邻接矩阵(对称)表示示例

3.3 图的遍历(2023 真题 + 2022 大题)

3.3.1 深度优先搜索 DFS(类似树的先序遍历)

c
#define MAXVEX 100
int visited[MAXVEX];  // 访问标记数组

void DFS(ALGraph G, int v) {
    printf("%d ", v);
    visited[v] = 1;                    // 标记已访问
    EdgeNode *p = G.adjlist[v].firstedge;
    while (p) {
        if (!visited[p->adjvex])
            DFS(G, p->adjvex);
        p = p->next;
    }
}

void DFSTraverse(ALGraph G) {
    for (int i = 0; i < G.n; i++)
        visited[i] = 0;                // 初始化
    for (int i = 0; i < G.n; i++)
        if (!visited[i])
            DFS(G, i);                 // 处理非连通图
}

DFS 手算(2022 大题格式):从顶点 1 开始,邻接点按编号升序,写访问序列。

图:1-2, 1-3, 2-4, 3-4, 4-5
DFS 从 1 开始:
第1步:访问 1,标记
第2步:1 的邻接点(升序):2, 3 → 先走 2,访问 2
第3步:2 的邻接点:1(已访问), 4 → 走 4,访问 4
第4步:4 的邻接点:2(已访问), 3, 5 → 升序先 3,访问 3
第5步:3 的邻接点:1(已访问), 4(已访问) → 无新点,**回溯**
第6步:回到 4,还有 5 未访问 → 访问 5
序列:1, 2, 4, 3, 5

💡 DFS 手算要点:① 走到死路就回溯;② 邻接点按题目要求排序(升序/降序);③ 用 visited 数组防死循环。

DFS(深度优先走迷宫)vs BFS(广度优先逐层波浪)遍历路径

3.3.2 广度优先搜索 BFS(类似树的层次遍历)

c
void BFS(ALGraph G, int v) {
    int queue[MAXVEX], front=0, rear=0;
    printf("%d ", v);
    visited[v] = 1;
    queue[rear++] = v;  // 入队
    
    while (front != rear) {
        int w = queue[front++];  // 出队
        EdgeNode *p = G.adjlist[w].firstedge;
        while (p) {
            if (!visited[p->adjvex]) {
                printf("%d ", p->adjvex);
                visited[p->adjvex] = 1;
                queue[rear++] = p->adjvex;
            }
            p = p->next;
        }
    }
}

BFS 手算(同一张图):

第1步:访问 1,入队 [1]
第2步:出队 1,邻接点升序 2, 3 → 访问 2、3,入队 [2,3]
第3步:出队 2,邻接点 1(已访问), 4 → 访问 4,入队 [3,4]
第4步:出队 3,邻接点 1(已访问), 4(已访问) → 无新点
第5步:出队 4,邻接点 2,3(已访问), 5 → 访问 5,入队 [5]
第6步:出队 5,结束
序列:1, 2, 3, 4, 5

💡 BFS 手算要点:用队列,先访问"所有一步能到的",再"两步"……一层层展开。

3.3.3 DFS vs BFS

对比DFSBFS
数据结构栈(递归)队列
策略深入优先,走到底再回头逐层展开
应用判断连通性、查找路径最短路径、网络爬虫

2022 大题第(1)问:从 1 开始 DFS,邻接点升序 → 写访问序列(就是上面的手算过程)

3.4 生成树与最小生成树(2021 大题45 + 2022 大题核心)

生成树

n个顶点、n-1条边的连通子图

DFS生成树:DFS遍历时经过的边构成的树 BFS生成树:BFS遍历时经过的边构成的树

最小生成树 —— 权值和最小的生成树

3.4.1 Prim 算法(加点法 · 2021 大题45)

思想:从一个顶点出发,每次选"已选集合"到"未选集合"的最短边,加入新顶点,直到所有顶点进树。

手算步骤(零基础版)

  1. 从起点(如顶点 1)开始,标记"已选"
  2. 找"已选顶点"和"未选顶点"之间的所有边,选权值最小的一条
  3. 把这条边的新顶点加入"已选"
  4. 重复 2-3,直到所有顶点都被选(共 n-1 条边)

手算例题(2021 大题风格):5 个顶点,边及权值如下,从顶点 1 开始用 Prim 求最小生成树。

边:1-2(3), 1-3(1), 2-3(2), 2-4(5), 3-4(6), 3-5(4), 4-5(7)

Prim 算法逐步生长最小生成树(加点法四步)

步骤已选集合候选最短边(权值)选中累计权值
11-2(3), 1-3(1)1-3(1)1
21-2(3), 3-2(2), 3-4(6), 3-5(4)3-2(2)3
32-4(5), 3-4(6), 3-5(4)3-5(4)7
42-4(5), 3-4(6), 5-4(7)2-4(5)12

最小生成树边集:{1-3, 3-2, 3-5, 2-4},总权值 12Prim 特点:加点法,O(n²),适合稠密图

3.4.2 Kruskal 算法(加边法 · 2022 大题)

思想:把所有边按权值从小到大排序,从最小开始选,只要不构成回路就选,直到选满 n-1 条边。

手算步骤(零基础版)

  1. 把所有边按权值升序排列
  2. 从最小权值边开始,逐条检查:加入后不形成回路就选
  3. 选满 n-1 条边结束

手算例题(同一张图,Kruskal):

边按权值升序:1-3(1), 2-3(2), 1-2(3), 3-5(4), 2-4(5), 3-4(6), 4-5(7)
步骤边(权值)构成回路?选中
11-3(1)
22-3(2)
31-2(3)是(1-2-3 成环)❌ 跳过
43-5(4)
52-4(5)✅(已 4 条边=n-1,结束)

最小生成树边集:{1-3, 2-3, 3-5, 2-4},总权值 12(与 Prim 结果一致!) ✅ Kruskal 特点:加边法,O(e log e),适合稀疏图 ✅ 两种算法结果可能不同(边的选择不同),但总权值最小且唯一(权值不等时)

3.4.3 Prim vs Kruskal 对比表

对比PrimKruskal
思路加点法(顶点出发)加边法(边出发)
时间复杂度O(n²)O(e log e)
适合稠密图(边多)稀疏图(边少)
关键操作每次选最短跨边每次选最短且不成环的边
真题2021 大题452022 大题(二选一)

3.5 最短路径

算法解决问题时间复杂度
Dijkstra单源最短路径O(n²)
Floyd所有顶点间最短路径O(n³)

💡 记忆:Dijkstra 单源(一个起点到所有点),Floyd 全源(任意两点间)

3.6 拓扑排序

对有向无环图(DAG)的顶点排序——如果A→B,则A在B前面

应用: 课程安排(先修课程)、工程流程

💡 拓扑排序:每次选"入度为 0"的顶点输出,删掉它的所有出边,重复直到全部输出。有环图无法拓扑排序。


④ 🧪【真题同源例题】

例题 1:入门基础题(先热热身)

有 6 个顶点的无向完全图,有多少条边?

逐项推演:

  1. 无向完全图:每对顶点之间都有边
  2. 6 个顶点任取 2 个的组合数:C(6,2) = 6×5/2 = 15
  3. 答案:15 条边(公式 n(n-1)/2)

验证:每个顶点连 5 条边,6 个顶点共 30 但每条边算了两次 → 30/2=15 ✅

例题 2:2022 真题改编(DFS 序列)

从顶点 1 开始 DFS,邻接点按编号升序,写出下面图的访问序列。

图:1-2, 1-3, 2-4, 3-4

逐步推演:

步骤当前顶点动作已访问序列
11访问 11
21邻接点升序 2,3 → 走 21, 2
32邻接点 1(已访问),4 → 走 41, 2, 4
44邻接点 2(已访问),3 → 走 31, 2, 4, 3
53邻接点 1,4 都已访问 → 回溯结束

✅ 答案:1, 2, 4, 3(DFS 序列)

例题 3:2021 真题改编(Prim 最小生成树)

用 Prim 算法从顶点 1 开始求下面图的最小生成树,写出选边顺序和总权值。

边:1-2(2), 1-3(4), 2-3(1), 2-4(5), 3-4(3)

逐步推演:

步骤已选集合候选边(权值)选中
11-2(2), 1-3(4)1-2(2)
21-3(4), 2-3(1), 2-4(5)2-3(1)
31-3(4,已选), 2-4(5), 3-4(3)3-4(3)
4全部顶点结束(n-1=3 条边)

✅ 选边顺序:1-2(2) → 2-3(1) → 3-4(3),总权值 2+1+3=6

例题 4:2022 真题改编(Kruskal 最小生成树)

用 Kruskal 算法求下面图的最小生成树,写出选边顺序。

边:1-2(2), 1-3(4), 2-3(1), 2-4(5), 3-4(3)

逐步推演(按权值升序):

步骤边(权值)成环?选中
12-3(1)
21-2(2)
33-4(3)✅(3 条边,结束)
41-3(4)是(1-2-3 成环)不选
52-4(5)不选

✅ 选边顺序:2-3(1) → 1-2(2) → 3-4(3),总权值 6(与 Prim 一致)


⑤ ⚠️【历年真题高频扣分坑】

#陷阱错误做法正确做法出处
1连通图边数9 顶点算 9 条连通最少 n-1=8 条(树)2024 填空5
2完全图 vs 连通图无向完全图当连通图完全图 n(n-1)/2,连通最少 n-1经典
3出度/入度混淆弧的方向看反出度=从 v 出发,入度=指向 v2024 简答4
4Σ度=2×边数有向图也乘 2无向图 Σ度=2e;有向图 Σ出=Σ入=e2024 简答4
5Prim 忘"跨边"选已选集合内部的边只能选"已选→未选"的边2021 大题45
6Kruskal 忘查环选了成环的边每选一条都要检查是否成环2022 大题
7DFS/BFS 顺序邻接点不排序按题目要求(升序/降序)访问2022 大题
8DFS 用队列以为 DFS 用队列DFS 用栈(递归),BFS 用队列经典
9生成树边数n 顶点生成树 n 条边生成树 = n 顶点 n-1经典
10邻接表边数无向图邻接表边结点数=边数无向图每条边存两次,结点数=2e经典

📌 最值钱的一条:第 5、6 条(Prim 跨边 + Kruskal 查环)是两道手算大题(2021、2022)的得分核心——画表逐步记录,一步都不许跳


⑥ 📝【课后自测练习题】

1. 有 7 个顶点的连通图,最少需要(  )条边(2024 真题风格)

A. 7  B. 8  C. 6  D. 21


2. 从顶点 1 开始 BFS(邻接点升序),下面图的访问序列是(  )(2023 真题风格)

图:1-2, 1-3, 2-4, 3-4

A. 1,2,3,4  B. 1,2,4,3  C. 1,3,2,4  D. 1,2,3


3. 用 Prim 算法从顶点 1 开始求最小生成树,选边顺序是(  )(2021 真题风格)

边:1-2(1), 1-3(3), 2-3(2), 2-4(4), 3-4(5)

A. 1-2 → 2-3 → 2-4  B. 1-2 → 2-3 → 3-4  C. 1-2 → 2-4 → 3-4  D. 2-3 → 1-2 → 3-4


4. 判断:DFS 借助队列实现,BFS 借助栈实现。(  )(经典)

A. 正确  B. 错误


👆 点击展开参考答案与解析

第1题C. 6

  • 连通图最少 n-1=7-1=6 条边(2024 填空5 同款)

第2题A. 1,2,3,4

  • BFS:访问 1 → 出队 1,邻接 2,3 入队并访问 → 出队 2,邻接 4 访问 → 出队 3(无新点)→ 出队 4
  • 序列 1,2,3,4(逐层展开)

第3题A. 1-2 → 2-3 → 2-4

  • Prim 逐步推演:
    • {1} 候选跨边:1-2(1)、1-3(3) → 选 1-2(1)
    • {1,2} 候选跨边:1-3(3)、2-3(2)、2-4(4) → 选 2-3(2)
    • {1,2,3} 候选跨边:2-4(4)、3-4(5) → 选 2-4(4)
  • 选边顺序:1-2(1) → 2-3(2) → 2-4(4),总权值 1+2+4=7
  • 解析:Prim 每一步只能选"已选集合到未选集合"的跨边,不能选集合内部的边

第4题B. 错误

  • DFS 用(递归),BFS 用队列

📝 原有闭卷真题挑战(保留原内容)

(点击下方空白查看答案)

1. 无向完全图 n个顶点,有多少条边?

2. 邻接矩阵和邻接表各自适用于什么场景?

3. 有8个顶点的连通图至少需要几条边?

4. 图的DFS和BFS分别借助什么数据结构实现?

5. 连通图的生成树有几个顶点、几条边?
👆 点击展开答案
  1. n(n-1)/2 条边
  2. 邻接矩阵→稠密图;邻接表→稀疏图
  3. 7条(n个顶点连通至少n-1条边,形成树)
  4. DFS用栈(递归),BFS用队列
  5. n个顶点、n-1条边

📖 教材习题对照

教材习题知识点难度
习题7.1~7.2图的基本术语⭐⭐
习题7.4~7.5邻接矩阵与邻接表⭐⭐⭐
习题7.7~7.8DFS与BFS⭐⭐⭐
习题7.10~7.14最小生成树/最短路径⭐⭐⭐⭐

对应教材:严蔚敏《数据结构》C语言版 第2版 → 第7章 图 对应考试大纲:考点17 — 图

📺 配套视频

复习到本考点 → 先看视频补讲,再刷上面「闭卷挑战」。

仅供个人学习 · 考生回忆版 · 非考试院原卷