详解链式前向星存图方式

详解链式前向星存图方式

什么是前向星的构造?

也就是对邻接表的一种存储方式,前向星就是一种特殊的边集数组,我们把边集数组中每一条边按照起点从小到大进行排序,起点相同的话,就按照终点的从小到大进行排序。
并且记录下以某个点为起点的所有边在数组中的存储的起始位置和权重,这样前向星就构造好了。这种存图方式适用于边数较少的稀疏图,即边的数量接近于点的数量的时候。

存储的方式的详解
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
}
用一个实际的例子来理解一下

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西瓜程序设计

您的打赏将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值