一、特点
存储效率高:对于无向图,邻接多重表能够避免邻接表中同一条边需要存储两次的问题,因为每条边在邻接多重表中只被表示一次。
灵活性高:由于每条边同时链接在两个链表中(分别对应其两个顶点),因此在进行边的增删查改等操作时更加方便。
可读性强:邻接多重表的结构清晰,能够直观地表示无向图中顶点与边之间的关系。
二、结构
邻接多重表由顶点表和边表组成:
顶点表:存储图中的顶点信息,每个顶点元素包含两个域:data域用于存放与顶点相关的信息;firstedge域(或类似指针)指向依附于该顶点的第一条边在边表中的节点。
边表:存储图中边的信息,每个边表节点包含多个域,以下是常见的几个域:
mark:标志域,用于标记该边是否被访问过或进行过其他特定操作。
ivex和jvex:分别存放该边两个顶点在顶点表中的位置(即下标)。
info:信息域,对于带权图,可以存放边的权值;对于无向图,此域可省略。
ilink和jlink:分别指向下一条依附于顶点ivex和jvex的边在边表中的节点。
三、构建方法
构建邻接多重表通常遵循以下步骤:
1、初始化:
创建一个空的邻接多重表,包括顶点表和边表。
2、填充顶点表:
根据无向图的顶点数,在顶点表中创建相应数量的顶点元素,并初始化firstedge域为NULL。
3、添加边:
遍历无向图中的每一条边,为每条边创建一个边表节点,并设置其ivex、jvex(以及可能的info)域。然后,将该节点分别插入到顶点ivex和jvex的边链表中,即更新相应顶点的firstedge域以及边表节点的ilink和jlink域。
四、应用场景
邻接多重表特别适用于需要频繁操作边的无向图问题,如边的删除、查找、标记等。在这些场景中,邻接多重表能够提供比邻接表更高效的操作性能,因为它避免了同一条边在邻接表中需要存储两次的问题。
此外,邻接多重表还广泛应用于图论及其相关领域的算法中,如图的遍历、最短路径计算、拓扑排序等。这些算法在利用邻接多重表作为图的存储结构时,能够更加方便地实现算法逻辑,提高算法的执行效率。