链式前向星
在学习算法spfa的过程之中,其代码的实现过程是用了链式前向星结构实现,因此了解并学习了一下链式前向星
什么是链式前向星
前向星的本质其实是静态链表,如果说邻接表存的是点的集合,那么链式前向星是存的是边的集合。
为什么要采用链式前向星
如果说邻接表是不好写但效率好,邻接矩阵是好写但效率低的话,前向星就是一个相对中庸的数据结构。前向星固然好些,但效率并不高。而在优化为链式前向星后,效率也得到了较大的提升。虽然说,世界上对链式前向星的使用并不是很广泛,但在不愿意写复杂的邻接表的情况下,链式前向星也是一个很优秀的数据结构。
主要代码实现
struct Edge
{
int next;//下一条边的编号
int to;//这条边到达的点
int dis;//这条边的长度
}edge[maxm];
void add_edge(int from,int to,int dis) //加入一条从from到to距离为dis的单向边
{
edge[++num_edge].next=head[from];
edge[num_edge].to=to;//将to记录
edge[num_edge].dis=dis;//将dis记录
head[from]=num_edge;//
}
head[i]数组与next
关于head[i]的含义,我们理解为指向 i 结点的第一条边。这是方便于我们在接下来调用的时候能够完好的访问:i结点第一条边通过head访问,剩下的边通过next指针指向。
总的来说: head[i]来指向 i 结点的第一条边 next指向下一条边
调用核心代码
for(int i=head[k];i!=0;i=edge[i].next)