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

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

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. 计算顶点的度、入度、出度

相关推荐
循着风16 小时前
二叉树的多种遍历方式
数据结构·算法
.格子衫.21 小时前
022数据结构之树状数组——算法备赛
数据结构·算法·1024程序员节
Yupureki21 小时前
从零开始的C++学习生活 16:C++11新特性全解析
c语言·数据结构·c++·学习·visual studio
對玛祷至昏1 天前
数据结构理论知识
数据结构·算法·排序算法
黄思搏1 天前
红黑树 - Red-Black Tree 原理与 C# 实现
数据结构·1024程序员节
剑锋所指,所向披靡!1 天前
数据结构的基本概念
数据结构
dragoooon341 天前
[优选算法专题四.前缀和——NO.31~32 连续数组、矩阵区域和]
数据结构·算法·leetcode·1024程序员节
py有趣1 天前
LeetCode算法学习之移除元素
java·数据结构·算法
captain3761 天前
数据结构易错点
数据结构·数据结构易错点
我不会插花弄玉1 天前
c语言实现队列【由浅入深-数据结构】
c语言·数据结构