一、图的基本概念(先理解这个!)
1. 什么是图?
-
图 = 顶点(Vertex) + 边(Edge)
-
顶点:表示实体(如城市、人物)
-
边:表示顶点间的关系(如道路、朋友关系)
2. 无向图 vs 有向图
-
无向图:边没有方向,像双向道路
A — B 表示 A和B互相连接
-
有向图:边有方向,像单行线
A → B 表示 A指向B,但B不指向A
二、邻接矩阵是什么?
1. 基本概念
-
邻接矩阵是一个二维表格(矩阵),用来记录顶点之间是否相连
-
行和列都代表图中的顶点
-
矩阵中的值:
-
1
(或权重):表示相连 -
0
:表示不相连
-
2. 简单比喻
-
像一份「社交关系调查表」:
-
行:我是谁
-
列:我认识谁
-
表格内容:我是否认识对方
-
三、无向图的邻接矩阵(详细示例)
1. 示例图结构(城市交通网):
A
/ \
B — C
\ /
D
顶点:A, B, C, D
边:A-B, A-C, B-C, B-D, C-D
2. 邻接矩阵构建:
A B C D
A 0 1 1 0
B 1 0 1 1
C 1 1 0 1
D 0 1 1 0
3. 详细解读:
-
A行:A与B相连(1),A与C相连(1),A与D不相连(0)
-
B行:B与A相连(1),B与C相连(1),B与D相连(1)
-
对称性 :因为是无向图,矩阵是对称的(对角线对称)
4. 为什么对称?
-
A连B 等价于 B连A
-
所以
matrix[A][B] = matrix[B][A] = 1
四、有向图的邻接矩阵(详细示例)
1. 示例图结构(微博关注关系):
A → B
↓ ↑
C → D
-
A关注B、C
-
C关注D
-
D关注B
2. 邻接矩阵构建:
A B C D
A 0 1 1 0
B 0 0 0 0
C 0 0 0 1
D 0 1 0 0
3. 详细解读:
-
A行:A→B(1),A→C(1),A→D(0)
-
B行:B没有关注任何人(全是0)
-
C行:C→D(1)
-
D行:D→B(1)
4. 关键特点:
-
不对称 :A关注B,但B不关注A →
matrix[A][B]=1
但matrix[B][A]=0
-
方向性:行→列(行指向列)
五、带权图的邻接矩阵(扩展知识)
1. 示例(城市间距离):
A
5/ \3
B — C
2\ /4
D
2. 邻接矩阵(记录权重):
A B C D
A 0 5 3 ∞
B 5 0 ∞ 2
C 3 ∞ 0 4
D ∞ 2 4 0
-
∞
表示不相连(或距离无穷远) -
数字表示实际距离
六、邻接矩阵的优缺点
优点:
-
快速判断是否相邻 :
matrix[i][j] == 1?
→ O(1)时间 -
适合稠密图(边很多的情况)
-
方便计算(如求顶点的度)
缺点:
-
空间浪费 :
对于n个顶点,需要n²空间,但很多位置是0
-
添加/删除顶点麻烦:需要重建矩阵
七、实战练习(检验理解)
练习1:无向图
1 — 2
| |
3 — 4
请写出邻接矩阵:
答案:
1 2 3 4
1 0 1 1 0
2 1 0 0 1
3 1 0 0 1
4 0 1 1 0
练习2:有向图
1 → 2
↓ ↓
3 → 4
请写出邻接矩阵:
答案:
1 2 3 4
1 0 1 1 0
2 0 0 0 1
3 0 0 0 1
4 0 0 0 0
八、常见考试问题
Q1:如何计算无向图顶点的度?
-
度 = 顶点连接边的数量
-
在邻接矩阵中 = 对应行(或列)中1的个数
示例:前面无向图中B的度 = B行中1的个数 = 3
Q2:如何计算有向图顶点的入度和出度?
-
出度:从顶点指出的边数 = 对应行中1的个数
-
入度 :指向顶点的边数 = 对应列中1的个数
示例:前面有向图中B的入度 = B列中1的个数 = 2(A→B, D→B)
通过以上详细的示例和解析,你应该能够:
-
区分无向图和有向图的邻接矩阵
-
自己构建给定图的邻接矩阵
-
从邻接矩阵还原图结构
-
计算顶点的度、入度、出度