一、前言
我们常见的存图数据结构有两种,一种是邻接矩阵,另一种是邻接表。而在邻接矩阵中,空间复杂度为 ,在稀疏图的情况下,相较于邻接表浪费了许多空间。而常规的邻接表是用链表进行操作,不便于打竞赛,因此大佬们在邻接表的基础上发明了这个简单易操作的结构——链式前向星
二、邻接表
因为链式前向星是由邻接表(链表)变化来的,邻接表是存储图的边集,我们简单回忆一下邻接表(具体内容不做展开):
下面是图
:
邻接表的结点结构为:
上图中adjvex
为邻接点,即边的终点;nextarc
连接同起点的下一个结点;info
存边长等信息,firstarc
连接该点对应的第一条边(因为是头插法,所以为最后插入的边)。
则由
得到的邻接表为(info
域在图中省略):
邻接表在每次插入结点时使用头插法。
三、链式前向星
在简单回忆了邻接表后,我们开始介绍竞赛中图论经常使用的存图结构——链式前向星(正文来了)。
有了邻接表的思想,链式前向星则十分容易理解,宏观上我们只需要把链表改成数组就行了,具体介绍如下:
首先我们写出链式前向星的数据结构及加边的代码:
namespace G{
//数据结构
int to[MAXM], head[MAXN], nxt[MAXM], tot;
void AddEdge(int u, int v, int w) {//u,v,w分别为边的起点、终点和边权
to[tot] = v;//填adjvex域
val[tot] = w;//填info域,这里为边权
nxt[tot] = head[u];//连接下一个结点
head[u] = tot++;//头指针移动
}
}
代码中to
对应邻接表中的adjvex
域,w
对应info
域,nxt
对应nextarc
域,head
对应头指针firstarc
域,加边代码功能见注释。
最后,你就可以像用链表一样使用链式前向星了,希望大家在竞赛中取得好的成绩。