今天王佬给我讲了链式前向星,非常开心,去年暑假的时候学了一次,后来就再也没学会,这次终于又又又会了,希望以后别忘记。
一、前期准备
1、首先以边的出发节点为分类节点,对有向边进行分类,分类节点为u,与u相连的所有节点代号为v。w数组记录的是u、v之间的边权。
2、一个数组用来记录节点的编号v,w数组记录的是u、v之间的边权。next数组记录的是同样与u节点相连的下一个v节点的值。
3、需要一个index变量来记录数组的使用情况。其实链式前向星将所有的节点编号v和边权w全部存在对应的两个数组中,每存完一个边就令index的值加一。以节点为例,从物理存储上看所有的节点v都存在了一个数组中,只不过链式前向星巧妙地使用next数组对齐进行了串联,将所有出发节点为u的边的终止节点v都串在了一起。所以head[u]的本质就是最后一个以u为分类节点的v所在的数组中的index。
二、头插法
链式前向星是一个链表,这个链表的维护采用的是头插法,就是每次记录的是与节点u相连的其他节点v串成的链表的头结点,需要的时候就会往链表头结点后面插入一个节点,节点序号为v。
1 | void add(int u, int v, int w) { |
就比如想要插入的边为(1,2,1)和(1,3,1)。首先,将head[u]的值初始化为-1,证明这个head指针后面没有节点。假设此时index = 0。
分类节点为1,所以有
1 | e[0] = 2;//e数组记录v的值 |
下面是头插法在已经有了一个节点的链表中插入一个节点
1 | e[1] = 3;//e数组记录v的值 |
三、链式前向星的遍历
1 | for(int i = head[index]; i != -1; i = next[i]) { |
四、链式前向星实现Dj
1 | #include<bits/stdc++.h> |