数据结构——图
(二)图的存储结构
存储结构
1.邻接矩阵表示法:
利用一个矩阵来表示图中顶点之间的关系,反映的是顶点间的相邻关系。一个n行n列的矩阵表示由n个顶点的图,如果(i,j)或者<i,j>属于边集合,则矩阵中第i行j列的值为1,否则为0。图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。
设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:
例如:的邻接矩阵为
看一个实例,下图左就是一个无向图:
从邻接矩阵的定义可以推断,无向图的邻接矩阵是对称的;有向图的邻接矩阵是则不具备该性质。
借助于邻接矩阵,可判定任意两点之间是否有边(或者弧)相连,并且容易求得各个顶点的度。对于无向图,顶点vi的度是邻接矩阵第i行(或列)的值不为0的元素数目(或元素的和);对于有向图,第i行元素之和为顶点vi的出度OD(vi),第j列的元素之和为顶点vj的入度ID(vj)。
从上面可以看出,无向图的边数组是一个对称矩阵。所谓对称矩阵就是n阶矩阵的元满足aij = aji。即从矩阵的左上角到右下角的主对角线为轴,右上角的元和左下角相对应的元全都是相等的。
从这个矩阵中,很容易知道图中的信息。
(1)要判断任意两顶点是否有边无边就很容易了;
(2)要知道某个顶点的度,其实就是这个顶点vi在邻接矩阵中第i行或(第i列)的元素之和;
(3)求顶点vi的所有邻接点就是将矩阵中第i行元素扫描一遍,arc[i][j]为1就是邻接点;
而有向图讲究入度和出度,顶点vi的入度为1,正好是第i列各数之和。顶点vi的出度为2,即第i行的各数之和。
若图G是网图,有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:
这里的wij表示(vi,vj)上的权值。无穷大表示一个计算机允许的、大于所有边上权值的值,也就是一个不可能的极限值。下面左图就是一个有向网图,右图就是它的邻接矩阵。
代码表示:
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
typedef char VertexType; //顶点类型应由用户定义
typedef int EdgeType; //边上的权值类型应由用户定义