图的存储:邻接矩阵法
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的路径的数目。