数据结构中邻接矩阵中的无向图和有向图

一、图的基本概念(先理解这个!)

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]=1matrix[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
  • 表示不相连(或距离无穷远)

  • 数字表示实际距离


六、邻接矩阵的优缺点

优点:
  1. 快速判断是否相邻
    matrix[i][j] == 1? → O(1)时间

  2. 适合稠密图(边很多的情况)

  3. 方便计算(如求顶点的度)

缺点:
  1. 空间浪费

    对于n个顶点,需要n²空间,但很多位置是0

  2. 添加/删除顶点麻烦:需要重建矩阵


七、实战练习(检验理解)

练习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)


通过以上详细的示例和解析,你应该能够:

  1. 区分无向图和有向图的邻接矩阵

  2. 自己构建给定图的邻接矩阵

  3. 从邻接矩阵还原图结构

  4. 计算顶点的度、入度、出度

相关推荐
养成系小王1 小时前
四大常用排序算法
数据结构·算法·排序算法
闪电麦坤952 小时前
数据结构:从前序遍历序列重建一棵二叉搜索树 (Generating from Preorder)
数据结构··二叉搜索树
闪电麦坤953 小时前
数据结构:二叉树的遍历 (Binary Tree Traversals)
数据结构·二叉树·
野渡拾光4 小时前
【考研408数据结构-05】 串与KMP算法:模式匹配的艺术
数据结构·考研·算法
pusue_the_sun12 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
liang_jy18 小时前
数组(Array)
数据结构·面试·trae
要做朋鱼燕19 小时前
【数据结构】用堆解决TOPK问题
数据结构·算法
秋难降20 小时前
LRU缓存算法(最近最少使用算法)——工业界缓存淘汰策略的 “默认选择”
数据结构·python·算法
Jayyih1 天前
嵌入式系统学习Day19(数据结构)
数据结构·学习