图的存储:邻接矩阵法

1.邻接矩阵的实现

邻接矩阵的定义:在无向图和有向图中,使用二维数组表示各个顶点的相邻情况:1代表相邻,0表示不相邻。
代码实现:

#define MaxVertexNum 100//顶点数目的最大值
typedef struct {
    char Vex [MaxVertexNum];//顶点表
    int Edge [MaxVertexNum] [MaxVertexNum] ;//邻接矩阵,边表
    int vexnum, arcnum;//图的当前顶点数和边数/弧数
}MGraph;;

注意:

  • 顶点中可以存更复杂的信息
  • 边可以用bool型或枚举型变量

2.求顶点的度,入度,出度

1.无向图

  • 第i个结点的度=第i行(或第i列)的非零元素个数。(时间复杂度为O(N))

2.有向图

  • 第i个结点的出度=第i行的非零元素个数。
  • 第i个结点的入度=第i列的非零元素个数。
  • 第i个结点的度=第i行、第i列的非零元素个数之和。

3.邻接矩阵法存储带权图(网)

分为有向网和无向网。
同样使用二维矩阵存储,无穷代表没有路径可达,反之值代表路径的长度。
代码实现:

#define MaxVertexNum 100//顶点数目的最大值
#define INFINITY  1000000//最大的int值  宏定义常量"无穷"
typedef char VertexType; //顶点的数据类型
typedef int EdgeType; // 带权图中边上权值的数据类型
typedef struct {
    VertexType Vex [MaxVertexNum];//顶点
    EdgeType Edge[MaxVertexNum][MaxVertexNum]; //边的权
    int vexnum, arcnum;//图的当前顶点数和弧数
}MGraph;;

4.临接矩阵的性能分析

1.空间复杂度

O(n2):只和顶点数相关,和实际的边数无关。

  • 适合用于存储稠密图
  • 无向图的邻接矩阵是对称矩阵,可以压缩存储(只存储上三角区/下三角区)

5.邻接矩阵法的性质

设图G的邻接矩阵为A(矩阵元素为0/1),
则A"的元素A[i][]等于由顶点i到顶点j的长度为n的路径的数目。

你可能感兴趣的:(数据结构与算法,数据结构,图论)