图的储存方式(上)-邻接矩阵

       主要的存储方式有两种:邻接矩阵和邻接表,前者属于图的顺序存储结构,后者属于图的链接存储结构。

       这里主要说邻接矩阵法。

       所谓邻接矩阵存储,是指用一个一维数组存储图中顶点的信息,用一个二维数组存储图中边的信息(各顶点之间的邻接关系),存储顶点之间邻接关系的二维数组称为邻接矩阵。

 

       结点数为n的图G=(V,E)的邻接矩阵A是n*n的。将G的顶点编号为v1,v2,…,vn。若(vi,vj)∈E,则A[i][j]=1,否则A[i][j]=0:

       对于带权图而言,若顶点vivj之间有边相连,则邻接矩阵中对应项存放着该边对应的权值,若顶点ViVj不相连,则用∞来代表这两个顶点之间不存在边:

       有向图、无向图和网对应的邻接矩阵示例如下图所示:

       图的邻接矩阵存储结构定义如下:     

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

注意:

1.在简单应用中,可直接用二维数组作为图的邻接矩阵(顶点啥的可以忽略)。

2.当邻接矩阵中的元素仅表示相应的边是否存在时,EdgeType可定义为值为0和1的枚举类型。

3.无向图的邻接矩阵是对称矩阵,对规模特大的邻接矩阵可采用压缩存储。

4.邻接矩阵表示法的空间复杂度为,其中n为图的顶点数|V|。

 

图的邻接矩阵存储表示法具有以下特点:

1.无向图的邻接矩阵一定是一个对称矩阵(并且唯一)。因此,在实际存储邻接矩阵时只需存储上(或下)三角矩阵的元素。

2.对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的度

3.对于有向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的出(或入度)。

4.用邻接矩阵法存储图,很容易确定图中任意两个顶点之间是否有边相连。但也有其局限性:要确定图中有多少条边,必须按行、按列对每个元素进行检测,所花费的时间代价很大。

5.稠密图适合使用邻接矩阵的存储表示:这样子存储效率比较高。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章