链式前向星存图
链式前向星存图
介绍
图的存储方法很多,最常见的除邻接矩阵、邻接表和边集数组外,还有链式前向星。
链式前向星是一种静态链表存储,用边集数组和邻接表相结合,可以快速访问一个节点的所有邻接点,在算法竞赛中广泛使用。
在本质上,链式前向星其实也是数组模拟邻接表,所以我写这一篇博客是为了补充数组模拟邻接表的静态数组版本。
理论知识部分
存储
链式前向星包括两个数组:边集和头结点
1.边集中的每一个元素\(i\)包含了\(id\)为\(i\)的边的终点、权值和与边\(i\)起点相同的下一条边的\(id\)(相当于邻接表中的\(Next\)数组)
2.头结点中的每一个元素\(i\)包含了以节点\(i\)为起点的第一条边(相当于邻接表中的\(head\)数组)
代码实现部分
存储实现
数组
struct Edge
{
int edge;//边的终点
int Next;//下一条边
int weight;//权值
}edge[N];
加入边
int cnt=0;//边数
void add(int from, int to, int weight)
{
edge[++cnt].to = y;//记录终点 注意用++cnt,而非cnt++
edge[cnt].weight = weight;//权值
edge[cnt].Next = head[from];
head[from] = cnt;//更新链表
}