图的存储

邻接矩阵法

用一个一位数组存储图中顶点的信息,用一个二维数组存储途中边的信息(即各顶点之间的邻接关系),存储顶点之间邻接关系的二维数组成为** 邻接矩阵**

zbTdEz

XpAIvD

矩阵中只需要存放0和1(没有边和有边),可以更换bool型或者枚举型使矩阵更小

Vex中元素的位置与Edge中的行与列对应


如果是带权图,可以讲对应位置的 1 改为权值,用 ∞(int的上限值) 表示不存在边 FoQ8rl 如果矩阵中的值是 ∞ 或 0,表示不存在边/弧


fa6JrD

邻接表法

无向图邻接表法 有向图邻接表法

类似树的孩子表示法,是一个顺序链式表

十字链表法(不用手写代码)

十字链表是有向图的一种链式存储结构。在十字链表中,对应于有向图中的每条弧有一个结点,对应于每个顶点也有一个结点(弧结点和顶点结点)。

十字链表法存储有向图

ryw5Zw

如上图,顶点依然是存入一个一维数组{v0,v1,v2,v3}。就以顶点 v0 来说,firstout 指向的是出边表中第一个结点 v3。所以 v0 边表的 headvex=3,而 tailvex 其实就是当前顶点 v0 的下标 0,由于 v0 只有一个出边顶点,所以 headlink 和 taillink 都是空。

我们重点需要来解释虚线箭头的含义,他其实就是此图的逆邻接表的表示。对于 v0 来说,它有两个顶点 v1 v2 的入边。因此 v0 的 firstin 指向顶点 v1 的边表结点中 headvex 为 0 的结点,如图中的①。接着由入边结点的 headlink 指向下一个入边顶点 v2,如图中的②。对于顶点 v1,它有一个入边顶点 v2,所以它的 firstin 指向顶点 v2 的边表结点中 headvex 为 1 的结点,如图中的③。顶点 v2 和 v3 也是同样有一个入边顶点,如图中④和⑤。

---- 摘录自程杰老师的《大话数据结构》

邻接多重表(不用手写代码)

tBDoxc

对比

 邻接表邻接矩阵十字链表邻接多重表
空间复杂度无向图:O(|V|+2|E|)
有向图:O(|V|+|E|)
O(|V|2)O(|V|+|E|)O(|V|+|E|)
适合用于存储稀疏图存储稠密图只适用于有向图只适用于无向图
表示方式不唯一唯一不唯一不唯一
删除边或顶点无向图中删除边或顶点都不方便删除边很方便,删除顶点需要大量移动数据很方便很方便
找相邻的边找有向图的入边必须遍历整个邻接表必须遍历对应行或列,时间复杂度为 O(|V|)很方便很方便

图的基本操作

错题集

  1. OhOQPt

    答案与解析:
    答案: D
    解析:
    有向图的邻接矩阵中,0和∞表示的都不是有向边 入度由列计算出,出度由行计算出
  2. sm1Qxt

    答案与解析:
    答案: A
    解析:
    邻接表存储时,顶点数n决定了顶点表的大小,边数 e 决定了边表结点的个数