1、
》》 所谓邻接矩阵存储,就是用一个一维数组存储图中顶点的信息,用一个二维数组
存储图中边的信息(即各顶点之间的邻接关系),存储顶点之间邻接关系的二维
数组称为邻接矩阵。
》》 结点数为 n 的图 G = (V , E)的邻接矩阵 A 是 n * n 的。将 G 的顶点编号为
V1 , V2 , V3 , ... , Vn 。 若 , 则 A [ i ][ j ] = 1 ,否则 A [ i ][ j ] = 0 。
》》 对于带权图而言,若顶点 Vi 和 Vj 之间有边相连,则邻接矩阵中对应项存放着该边
对应的权值,若顶点 Vi 和 Vj 不相连,则用 ∞ 来代表两个顶点之间不存在的边。
》》 有向图及其邻接矩阵
》》 无向图及其邻接矩阵
》》 网及其邻接矩阵
》》图的邻接矩阵存储结构定义如下:
#define MaxVertexNum 100 // 顶点数目的最大值
typedef char VertexType ; // 顶点的数据类型
typedef int EdgeType ; // 带权图中边上权值的数据类型
typedef struct{
VertexType Vex[MaxVertexNum]; // 顶点表
EdgeType Edge[MaxVertexNum][MaxVertexNum]; // 邻接矩阵,边表
int vexnum , arcnum; // 图的当前顶点数和弧数
} MGragh ;
注意:1)、在简单应用中,可直接用二维数组作为图的邻接矩阵(顶点信息等均可省略)。
2)、当邻接矩阵中的元素仅表示相应的边是否存在时, EdgeType 看定义为值 0 和 1 的枚举类型。
3)、无向图的邻接矩阵是对称矩阵,对规模特大的邻接矩阵可采用“ 压缩存储”
4)、邻接矩阵表示法的空间复杂度为 O() ,其中 n 为图的顶点数 | V | 。
2、图的邻接矩阵存储表示法具有以下特点:
1)、无向图的邻接矩阵一定是一个对称矩阵(并且唯一)。因此,在实际存储邻接矩阵时只需要存储上
(或下)三角矩阵的元素即可。
2)、对于无向图,邻接矩阵的第 i 行(或者第 i 列)非零元素(或者非 ∞ 元素)的个数正好是第 i 个顶点
的度 TD(Vi)
3)、对于有向图,邻接矩阵的第 i 行(或者第 i 列)非零元素(或者非 ∞ 元素)的个数正好是第 i 个顶点
的出度 OD(Vi) (或者入度 ID(Vi))。
4)、用邻接矩阵存储图,很容易确定图中任意两个顶点之间是否有边相连。但是,要确定图中有多少条
边,则必须按行、按列对每个元素进行检测,所花费的时间代价很大。这是用邻接矩阵存储图的局限性。
5)、稠密图适合使用邻接矩阵的存储表示。
6)、设图 G 的邻接矩阵为 A ,的元素 等于由顶点 i 到顶点 j 的长度为 n 的路径的数目。