从0开始学习数据结构-图-图的存储方法(邻接矩阵存储方法)

398 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

邻接矩阵(adjacency matrix)存储方法也称数组存储方法,是因为这种方法的核心思想就是利用两个数组来存储一个图,其构造原理比较简单。

对于具有n个顶点的图G=(V,E),定义一个具有n个元素的一维数组VERTEX[0..n-1],将图中顶点的数据信息分别存人该数组的一个数组元素中(若图中顶点的数据信息仅为序号,则该一维数组可以省去)。另外,定义一个二维数组A[0..n-1][0..n-1],该二维数组通常被称为邻接矩阵。若以顶点在VERTEX数组中的下标来代表一个顶点,则邻接矩阵中元素A[i][j]存放顶点i到顶点j之间的关系信息,有:

不难看出,采用邻接矩阵的存储方法具有以下特点:

    • 无向图的邻接矩阵一定是一个对称矩阵。 因此,按照压缩存储的思想,在具体存放邻接矩阵时只需存放上(或者下)三角形矩阵的元素即可。
    • 不带权的有向图的邻接矩阵一般来说是一个稀疏矩阵(特别是对于稀疏图) 。因此可以采用三元组表或十字链表的方法存储邻接矩阵。
    • 对于无向图,邻接矩阵的第i行(或者第i列)非零元素(或者非∞元素)的个数正好是第i个顶点的度TD(vi)。
    • 对于有向图,邻接矩阵的第i行(或者第i列)非零元素(或者非∞元素)的个数正好是第i个顶点的出度OD(vi)(或者入度ID(vi))。
    • 采用邻接矩阵方法存储一个图,很容易确定图中任意两个顶点之间是否存在边(或弧)相连。但是,要确定图中具体有多少条边,则必须按行,按列对每个元素进行检测,所花费的时间代价较大,这是采用邻接矩阵存储图的局限性。
    • 对于具有n个顶点的图采用邻接矩阵方法,邻接矩阵占用n×n个存储位置,因而其空间复杂度为O(n 2 )。这种方法比较适合于稠密图的存储,而对于稀疏图,则势必造成存储空间的浪费。
typedef int vertype;
typedef struct edge{
    int adjvex; //改边的终止顶点在顶点结点中的位置
    int weight;
    struct edge * next;  //指向下一个边结点
} ELink;
typedef struct ver{
    vertype vertex;  //顶点的数据信息
    ELink *link;  // 指向第一条边所对应的边结点
} VLink;