1.邻接矩阵:
用两个数组来表示图。一个一维数组存储图中顶点的信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。
设图G有n个顶点,则邻接矩阵是一个n×n的方阵,定义为:
mrc[i][j]=1,该边或弧存在则标为1
= 0,不存在的边标为0
主对角线的值都为0,因为不存在顶点到自身的边。arc[0][1]=1代表V0到V1的边存在,为零则代表该边不存在。因为是无向图,所以arc[0][1]=arc[1][0],是关于主对角线对称的,所以无向图的边数组是一个对称矩阵。(a(ij)=a(ji))
某个顶点的度等于该顶点在矩阵中的第i行(第i列)的元素之和,V1的度=1+0+1+0=2。
有向图样例:
V1的入度等于V1列的元素之和
V1的出度等于V1行的元素之和
设图G是网,
则邻接矩阵是一个n×n的方阵,定义为:
mrc[i][j]=W(ij),该边的权值
=0,i=j
=∞,其他不存在的边
2.邻接表:
邻接表是一种把数组与链表相结合的存储方法。
图中顶点用一个一维数组存储,每个数据元素还需要存储指向第一个邻接点的指针域。
图中每个顶点的所有邻接点构成一个单链表,无向图称为顶点的边表,有向图称为顶点作为弧尾的出边表。
有向图样例:
其逆邻接表为:
有向图的邻接表是以顶点为弧尾来存储边表的,这样很容易得到每个顶点的出度,有时为了确定顶点的入度,可以以顶点为弧头来存储边表,称为有向图的逆邻接表。
对于带权值的网图,可以在边表结点在增加一个数据域weight,如图:
3.十字链表:
把邻接表与逆邻接表结合起来。
其顶点表设置为一个数据域data,两个指针域firstin表示入边表头指针,firstout表示出边表头指针。
其边表结点设置为tailvex表示弧的起点的下标,headvex表示弧的终点的下标,headlink表示入边表的指针域,指向终点等于headvex的下一条边,taillink表示出边表的指针域,指向起点等于tailvex的下一条边。如果是网,可以再加一个数据域weight。
4.邻接多重表:
其顶点表与邻接表一样
其边表设置为:ivex ilink jvex jlink
其中ivex和jvex是该边所依附的两个结点
ilink指向依附于顶点ivex的下一条边
jlink指向依附与顶点jvex的下一条边
5.边集数组
边集数组是由两个一维数组构成。一个是存储顶点的信息,另一个是存储边的信息,这个边数组每个数据元素由一条边的起点下标(begin)、终点下标(end)和权(weight)组成。