1.前向星存储
前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,
并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了.
比如有起点终点和权值为以下的边:
1 2 1 // 1->2 权值为1
2 3 2
3 4 3
1 3 4
4 1 5
1 5 6
4 5 7
重新排列以后就为:
1 2 1
1 3 4
1 5 6 // 以1为开头的集合
2 3 2 // 以2为开头的集合
3 4 3 // 以3为开头的集合
4 1 5
4 5 7 // 以4为开头的集合
由于排序需要nlogn时间,有些慢,可以优化为不需要排序的链式前向星
2.链式前向星
不排序我们就要对顺序做一个记录 :
开辟一个last数组来保存以 i 开头集合最后一个元素的下标idx
举个例子 :
1 2 1 // 1->2 权值为1 ,下标为1
2 3 2 // 下标为2
3 4 3 // 下标为3
1 3 4 // 4
4 1 5 // 5
1 5 6 // 6
4 5 7 // 7
上叙边中,以 1 开头集合最后一个边的下标为 6 (1 5 6 ) ,last[1] = 6;
为了便于后续遍历,last数组初始值赋值为-1
然后在边的存储设计中(结构体构造中),还需要加一个pr变量表示该元素的上一个元素的下标idx
举个例子,还是上叙边,边(1 3 4) 的 pr 就为 1 (1 2 1)
而由于last数组的存在,pr的值其实就是现在last[f]中的值(加入一个新元素此时该新元素就是集合最后一个,last[f]就为对应下标)
** 当然第一个元素的pr就为last[]中的初始值-1,表示为一个元素 **