52-图的邻接矩阵存储结构及算法

1. 图的存储结构

  通常我们要根据图的逻辑结构来设计图的存储结构来 存储每个顶点的信息,存储每条边的信息。图的存储结构有以下两种:

  1. 邻接矩阵存储方法

  2.邻接表存储方法

2. 邻接矩阵存储方法

  邻接矩阵是表示顶点之间相邻关系的矩阵。设G = (V , E)是具有n(n > 0)个顶点的图,顶点的编号依次为0 ~ n-1。G的邻接矩阵A是n阶方阵,其定义如下所示:

这里写图片描述
图1-无向图

  我们知道邻接矩阵A是表示无向图中顶点之间相邻关系,比如在无向图中(0,1)顶点之间有一条边,互为邻接点关系,那么对应的在邻接矩阵A[0][1]中对应的元素就为1 。再比如无向图中(0,0)是顶点0到顶点0自己,没有边,不是邻接点关系,那么在邻接矩阵A[0][0]中对应的元素就为0。

  因此我们可以总结为:若(i,j)∈ E( G ),说明顶点之间互为邻接点关系,那么A[i][j] = 1;其他情况A[i][j] = 0 。



这里写图片描述
图2-有向图

  对于有向图来说,邻接矩阵A是表示有向图中顶点之间的相邻关系,如果有相邻关系则邻接矩阵A中对应的元素值就为1。比如在有向图中<0,1>顶点之间有一条边,顶点0和顶点1互为邻接点关系,那么对于的在邻接矩阵A[0][1]中的元素值为1 。又比如有向图中不存在顶点1到顶点0这样的一条边,那么在邻接矩阵A[1][0]中对应的元素值为0。

  因此我们可以总结为:若< i,j > ∈ E( G ),说明顶点之间互为邻接点关系,那么A[i][j] = 1;其他情况A[i][j] = 0 。



这里写图片描述
图3-带权无向图

  对于带权无向图来说,(1,2)顶点之间互为邻接点关系,且顶点1到顶点2的边的权为8,那么在邻接矩阵A[1][2]对应的元素值为8。而顶点1到顶点3不是互为邻接点关系,没有边,因此顶点1到顶点3的权无穷大,那么在邻接矩阵A[1][3]对应的元素值用“∞”符号表示,也就是无穷大的意思。顶点1到顶点1非邻接点关系,在邻接矩阵A[1][1]中元素值为0表示,同时我们还能看到带权无向图的邻接矩阵A也是一个对称关系。

因此我们可以总结为:
   w i j 表示顶点i到顶点j的边的权

  如果i ≠ j,且(i,j)∈ E(G),说明顶点i和顶点j互为邻接点关系,那么A[i][j] = w i j

  如果i = j,那么A[i][j] = 0

  其他情况,那么A[i][j]用“∞”符号表示

这里写图片描述
图4-带权有向图

  经过有向图,无向图,无向带权图的学习,相信你对这几种图结构的特点非常清楚了,对于带权有向图同理,我们就不再详细介绍,直接总结为:
   w i j 表示顶点i到顶点j的边的权

  如果i ≠ j,且< i,j > ∈ E(G),说明顶点i和顶点j互为邻接点关系,那么A[i][j] = w i j

  如果i = j,那么A[i][j] = 0

  其他情况,那么A[i][j]用“∞”符号表示

3. 邻接矩阵的特点

  1.图的邻接矩阵表示是唯一的。

  2.通过学习邻接矩阵的存储方法我们可知,对于无向图的邻接矩阵一定是一个对称矩阵,既然是对称矩阵,那么我们就可以考虑压缩存储。

  而不少邻接矩阵是一个稀疏矩阵,当图的顶点较多时,可以采用三元组的方式存储。比如对于有向图的邻接矩阵来说,并不是对称的,更接近于稀疏矩阵,因此更适合采用三元组的方式存储。

  3. 另外,从这样的邻接矩阵中我们还可以很方便的得到顶点的度。

  对于无向图来说,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的度。比如从图1(无向图)的邻接矩阵中的第0行的非零元素(或非∞元素)个数为2,那么我们就可以知道无向图中第0个顶点的度就为2(不理解的小伙伴可以回到图1看一下),即从顶点0出发的边有2条,而邻接矩阵中的第i列中非零元素个数也是2,则说明到达顶点0的边也有2条。

  对于有向图来说,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的出度(或入度)。比如从图2(有向图)的邻接矩阵中的第0行的非零元素(或非∞元素)个数为1,说明第0个顶点的出度为1。且图2(有向图)的邻接矩阵中的第0列中非零元素(或非∞元素)个数为1,说明第0个顶点的入度也是为1。

  4. 采用邻接矩阵存储图,很容易确定图中任意两个顶点之间是否有边相连。要确定图中有多少条边,则必须按行,按列对每个元素进行检测,时间消耗较大。

4. 邻接矩阵的数据类型定义

这里写图片描述
图5

  对于上图中这样的存储结构,我们要思考的是怎么用程序设计语言去定义邻接矩阵的数据类型,而前面我们说过:需要存储每个顶点的信息,存储每条边的信息;在实际应用中顶点可能存在某些意义,因此必须定义一个顶点类型,用于存放顶点的信息,定义如下:

#define MAXV <最大顶点个数>

#define LIMITLESS 9999   //9999表示∞

//顶点类型
typedef struct
{
    int no;             //顶点编号
    InfoType info;      //顶点其他信息
} VertexType; 

//图的定义:邻接矩阵
typedef struct 
{
    int n,e;                    //顶点数,边数
    int edges[MAXV][MAXV];      //邻接矩阵
    VertexType vexs[MAXV];      //存放顶点信息
} MGraph;

猜你喜欢

转载自blog.csdn.net/qq_35733751/article/details/81047881
今日推荐