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

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

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

相关推荐
dragoooon347 分钟前
[优选算法专题三.二分查找——NO.24搜索旋转排序数组中的最⼩值]
数据结构·leetcode·动态规划
Haooog8 分钟前
654.最大二叉树(二叉树算法)
java·数据结构·算法·leetcode·二叉树
那我掉的头发算什么2 小时前
【数据结构】双向链表
java·开发语言·数据结构·链表·intellij-idea·idea
半桔2 小时前
【STL源码剖析】从源码看 list:从迭代器到算法
java·数据结构·c++·算法·stl·list
拾光Ծ2 小时前
【C++】STL之list模拟实现:关于链表容器的双向迭代器你知道多少?
开发语言·数据结构·c++·list·visual studio
轩源源2 小时前
双向链表,这也太简单了吧!(C语言实现)
c语言·数据结构·算法·链表·青少年编程
暴力求解3 小时前
数据结构---栈和队列详解(上)
开发语言·数据结构·c++
小胖xiaopangss5 小时前
栈的压入弹出序列--牛客
数据结构·c++·算法
程序员莫小特5 小时前
老题新解|求三角形面积
开发语言·数据结构·c++·算法·信息学奥赛一本通
懒羊羊不懒@6 小时前
数据结构绪论
数据结构