【知识点解析】
图的存储方法很多,除了最常见的邻接矩阵、邻接表外,还有链式前向星。
链式前向星是用数组模拟邻接表存图的一种优秀的数据结构,是一种特殊的边集数组。它在算法竞赛中被广泛应用。
从链式前向星的核心代码 https://blog.csdn.net/hnjzsyjyj/article/details/126474608 可知,它的实现用到了val[]、e[]、ne[]、h[]等四个数组。这四个数组的含义必须十分清楚,否则将对理解链式前向星造成困难。现以链式前向星加边操作的核心代码为例,分述如下:
一、链式前向星加边操作的核心代码
void add(int a,int b,int w) {
val[idx]=w,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
二、val[]、e[]、ne[]、h[] 四个数组的含义
初始时 h[] 数组初始化为-1。然后,以链式前向星加边操作的核心代码为例,分述val[]、e[]、ne[]、h[] 四个数组的含义如下。
val[idx] 表示第 idx 条边的权值。
e[idx] 表示第 idx 条边的终点。
ne[idx] 表示与第 idx 条边同起点的最近一次被添加的边的编号。
h[a] 表示以结点 a 为起点的最近一次被添加的边的编号。这个表述是在使用 ne[idx]=h[a] 时,也即使用 h[a]=idx++ 更新 h[a] 之前而言的。要特别注意这个语境。
【链式前向星加边过程图解】
下面以如下测试数据为例,图解链式前向星的加边过程。
/*起点 终点 权值
1 2 7
1 4 5
2 3 12
3 4 18
2 5 36
3 5 51
*/
在图解过程中,请仔细品读 val[idx]、e[idx]、ne[idx]、h[a] 等数组值的变化。
依据 https://www.bilibili.com/read/cv13449207 所述过程及本例数据所创建的链式前向星如下图所示。
【参考文献】
https://www.bilibili.com/read/cv13449207
https://cloud.tencent.com/developer/article/1912251