详解链式前向星存图方式
什么是前向星的构造?
也就是对邻接表的一种存储方式,前向星就是一种特殊的边集数组,我们把边集数组中每一条边按照起点从小到大进行排序,起点相同的话,就按照终点的从小到大进行排序。
并且记录下以某个点为起点的所有边在数组中的存储的起始位置和权重,这样前向星就构造好了。这种存图方式适用于边数较少的稀疏图,即边的数量接近于点的数量的时候。
存储的方式的详解
int[] he = new int[N], e = new int[M], ne = new int[M], w = new int[M];
int idx=0;
void add(int a, int b, int c) {
e[idx] = b;
ne[idx] = he[a];
he[a] = idx;
w[idx] = c;
idx++;
}
对存图用到的几个数组作简单解释:
- 首先 idx 是用来对边进行编号的,
- he[i]数组:存储的是同一起点的边的集合的头结点(即第一条边对应的索引位置,这些相同起点边的集合以链的形式存储)。比如h[1]=2; 代表的是以1为起点的第一条边对应的索引位置是2,
- e[i]数组:代表访问某一条边指向的节点,e[2]=6表示索引为2的这条边指向的是6结点。
- ne[i]数组:由于相同的起点的边集合是以链表的形式存储,用于找到下一条边。ne[2]=1表述和第二条边的起点相同的下一条边的索引是1。
- w [i]数组:用于记录某条边的权重为多少。
因此当我们想要遍历所有由 a 点发出的边时,可以使用如下方式:
for (int i = he[a]; i != -1; i = ne[i]) {
int b = e[i], c = w[i]; // 存在由 a 指向 b 的边,权重为 c
}