My Little World

图的存储结构

1.邻接矩阵

1.无向图

graph1
一个一维数组存储图中顶点信息,

顶点数组 v0 v1 v2 v3

一个二维数组(邻接矩阵)存储图中边或弧的信息
0表示不存在顶点间的边,1表示顶点间存在边

v0 v1 v2 v3
v0 0 1 1 1
v1 1 0 1 0
v2 1 1 0 1
v3 1 0 1 0

无向图构成的邻接矩阵为对称矩阵,对角线值为0
—–顶点Vi在邻接矩阵中第i行(或第i列)的元素之和为该顶点的度
—–扫描矩阵中第i行元素,元素为1的列为顶点Vi的邻接点

2.有向图

graph2
一个一维数组存储图中顶点信息,

顶点数组 v0 v1 v2 v3

坐标[Vi][Vj]的值,1表示Vi指向Vj的弧存在,0表示不存在

v0 v1 v2 v3
v0 0 0 0 1
v1 1 0 1 0
v2 1 1 0 0
v3 0 0 0 0

第Vi列的元素之和为顶点Vi的入度
第Vi行的元素之和为顶点Vi的出度

3.网

tu3
邻接矩阵各元素的值不再用0/1表示,而是用权表示
顶点间若不存在弧,则用\infty无穷表示,顶点自己到自己的权为0

v0 v1 v2 v3
v0 0 \infty \infty 18
v1 8 0 2 \infty
v2 4 \infty 0 \infty
v3 \infty \infty \infty 0

2.邻接表

无向图

顶点用一个一维数组存储
每个顶点Vi的所有邻接点构成一个线性表,由于个数不确定,用单链表来表示
tu4
tu5

有向图

把顶点当弧尾建立邻接表,邻接表长度就是该顶点出度
tu6
把顶点当弧头建的表叫逆邻接表,邻接表长度就是该顶点入度
tu7

在边表结点定义中再增加一个数据域来存储权值
tu8

3.十字链表(有向图)

顶点表结构

|data|firstIn|firstOut|
data:顶点数据
firstIn:第一个入边表的指针
firstOut:第一个出边表的指针

边表结点结构 表示以条边

tailVex headVex headLink tailLink

tailVex:该弧起点的顶点在顶点表的下标
headVex:该弧终点的顶点在顶点表的下标
headLink:指向headVex的弧的指针
tailLink: 从tailVex出发的弧的指针
graph2
tu9

4.邻接多重表(无向表)

关注对象是图中的表不是顶点
|iVex|iLink|jVex|jLink|
iVex和jVex是与某条边依附的两个顶点在顶点表中的下标
iLink:指向依附顶点iVex的下一条边,
jLink:指向依附顶点jVex的下一条边,
tu10

5.边集数组

由两个一维数组构成
一个是存储顶点的信息
另一个存储边的信息
边数组的每个数据元素由一条边的起点下标(begin)、终点下标(end)和权(weight)组成

tu11

顶点数组 v0 v1 v2 v3
边数组 begin end weight
edges[0] 0 3 5
edges[1] 1 0 4
edges[2] 1 2 3
edges[3] 2 0 8