上午开了图论的基础知识,下周一(据说)真哥将对链式前向星作深入讲解,因此今天根据上午的介绍,稍作预习整理。
所谓前向星,指的是一种特殊数组,用以存储各节点的连边信息。大致原理是在(vector可能舒服些)数组中加入各边的起点、终点和长度三个信息,最终进行一次sort,令起点编号较小的靠前,同起点的边按终点由小到大排序。前向星数组的结构很容易理解,但由于时间复杂度高(排序)、维护繁琐(要额外开数组存各节点的度、首边位置等信息),我们找到了链式前向星来弥补它的缺点。
(结构示意就不贴了,毕竟真哥课件里有(咕咕咕))
链式前向星存图的特点,可以概括为“以边指边”。具体来说,对于每个节点,在只存其出边的前提下,只保留最后读入的那一条出边的信息。
而其余的边怎么办呢?我们令新加入的这个边在终点v、权值w之外,再存一个变量nxt,表示它这一点的上一条边在edge数组中的位置。这一信息在原先的head[u]中存储。之后,令head[u]更新为这一边的下标。这样我们就实现了在原先在的某一点中存入一条新边,并保留其它边的信息。
遍历时,我们只要从head[u]所指的这一边出发,以edge[i].nxt作为i的下一个值,直到i为0(最初head[u]的空值被赋给了这一条最初的边)为止。
下面贴上简化后的存边和遍历代码,进一步学习其它用(操)法(作)后再更新。注意由于按边的起点存储,对于无向图,我们需要存入两条边,当然要开两倍的空间。