一.邻接矩阵
邻接矩阵很简单,假设我们有n个变量,那么我们就创建一个n*n的矩阵G。假设弧是为<i,j>那么我们可以通过矩阵G[i][j]的值来判断这个弧是否存在。比如不存在的弧,我们规定为值为0,存在的弧则为1,若有权,则为它的权。
例如下图所示的图,用邻接矩阵表示则为:
∣
0
1
0
0
1
0
1
1
0
0
0
0
0
0
0
0
∣
\begin{vmatrix} 0 & 1 &0 &0 \\ 1&0 &1 &1 \\ 0&0 &0 &0 \\ 0&0 &0 &0 \end{vmatrix}
∣∣∣∣∣∣∣∣0100100001000100∣∣∣∣∣∣∣∣
我们可以把这个图看作为:
这样就好理解了。
如果是无向图的话,我们只用一个对角矩阵即可。
二.邻接表
1.邻接表
假设我们为结点创建一个数据类型,然后该结点指向的弧也是一个数据类型,分别叫表结点
和头结点
,那么我们可以这样表示:其中info可要可不要,用于保存其他信息,比如弧的权。
假设为了实现这个图:
我们先顺序创建顶点结点,括号内的值,是我们结点的顺序储存的下标。
添加A的所有弧:
添加B的所有弧:
同理,最后完成则为:
邻接表非常容易找到任意顶点的第一个邻接点和下一个领接点。但是如果要判定是否有边或弧相连,尤其是边,那是非常麻烦的。
2.逆邻接表
在学十字链表储存法之前,了解一下概念,有助于理解十字链表。
还是这个图,还是这种储存方式,只不过把弧给换个方向,比如上图的逆邻接表则为:
三.十字链表
简单来说,十字链表就是将邻接表和逆邻接表合二为一了。一般用于有向图。
它的储存结构是:
tailvex
:弧尾
headvex
:弧头
hlink
:弧头相同的下一条弧
tlink
:弧尾相同的下一条弧
info
:还是该弧的信息
我们依旧还是先顺序创建顶点:
然后再根据弧尾为每个顶点创建弧:
然后我们把0、1、2、3的tlink
指向值相同的tailvex
,hlink
指向值相同的的headvex
。比如:
这样就构建了一个表。可能我这个图不怎么好看,看其他的版本:
四.邻接多重表
我们采用这种方式储存结点边和顶点。mark
用于遍历时,确定是否遍历过,标记变量。
ivex
和jvex
是当前边的顶点值,ilink
指向相同ivex
的边,jlink
指向相同jvex
的边。
我们看看这个图:
还是依旧顺序创建顶点结点:
然后依旧根据ivex
创建每条边:
ilink
指向相同ivex
的边,jlink
指向相同jvex
的边: