求最短路是图论中最基础的算法,最短路算法挺多,本文介绍SPFA算法。 关于其他最短路算法,请看我另一篇博客最短路算法详解
链式前向星概念
简单的说,就是存储图的一个数据结构。它是按照边来存图,而邻接矩阵是按点来存图,故链式前向星又叫边集数组
为何用链式前向星
当图的边数不多,而节点数很多(稠密图)的时候,如果我们仍然用邻接矩阵来存的话,内存占用可能会很大,而这种情况在ACM竞赛中又是很常见的,此时链式前向星就显得尤为重要。
链式前向星详解
主要涉及到两个数组,一个是head[MAXE]数组,另一个是edge[MAXE]数组:
// edge数组是一个边集数组,存放一条边的信息 // to --- 该条边的终点 // next --- 下一条要访问的边(存的是edge数组的下标). // 即:访问完了edge[i],下一条要访问的就是edge[edge[i].next], // 如果next为0,表示now这个节点作为起点的边已经全部访问完.(下一步:Q.front()) // w --- 该条边的权值 struct Node { int to,next,w; }; Node edge[MAXE]; // idx --- edge数组的下标 // head[i] --- 表示以i节点为起点的所有出边在edge数组中的起始存储位置为head[i]. // (如果head[i]为0,表示结点i没有出边) int idx,head[MAXV];