前言
有向图的表示结构有多种,由于其有向性,结构中要人为给它规定起点和终点。对于无向图,我们可以根据有向图的结构,加双向边进行实现,但除了空间翻倍外,在某些要对边进行标记的问题时,还要去找到反向边,有可能这个复杂度不是 O ( 1 ) O(1) O(1) 的,那么整体复杂度也会相应提升。于是,多重邻接表可以有效解决这个问题。本文主要介绍多重邻接表的概念、定义等。
概念
和十字链表类似,多重邻接表是无向图的一种链式存储结构,区别的是多重邻接表:
对于结点的设置不再把出边和入边分成两张链表,而是一张链表表示邻边;
对于边的设置不再区分起点和终点。除此之外,多重邻接表在弧的结点设置还专门设置了一个 Mark 标志,用于处理该弧在算法流程中是否被访问。
定义
结点结构(VexNode)
数据 | 邻边 |
---|---|
data | firstedge |
弧结构(EBox)
访问标记 | 弧的顶多 i | 弧的顶点 j | 依附于 i 点的下一条弧 | 依附于 j 点的下一条弧 | 数据 |
---|---|---|---|---|---|
mark | ivex | jvex | ilink | jlink | data |
结构体代码
#define MAX_VERTEX_NUM 20
typedef struct EBox {
VistIf mark;
int ivex, jvex;
struct EBox *ilink, *jlink;
InfoType data;
}EBox ;
typedef struct VexBox {
EBox *firstedge;
VerTexType data;
}VexBox ;
typedef struct {
VexBox adjmulist[MAX_VERTEX_NUM];
int vexnum, edgenum;
}AMLGraph;