浅谈前向星
作者:互联网
目录
前向星
思路
前向星跟邻接表非常像,但是邻接表是二维数组,而前向星是一位数组,他就是把每个都在一维数组中留足空间,记录头和尾,其实这个前向星像是在为后文的链式前向星做铺垫。
链式前向星
思路
链式前向星就是动态开点的前向星,因为前向星要给所有可能的边留足空间,所以会有许多空间浪费,占用大量空间。此时我们可以动态开边,用多少条边就开多少的空间。
首先,我们知道,前向星是记录头和尾,我们可以这样想,我们让每一条边都记录上一条输入的从同一起点出发的边的编号,也就是说,我们只要记录尾,就可以遍历以某个节点为起点的所有的边。
这时候我们就没有必要保留它的顺序了,因为你每一条边都可以找到上一条输入的边,不论怎样顺序,都可以找到。
我们设以\(x\)为节点的最后一条输入的边为\(last[x]\),第\(a\)条边的上一条边(以同一节点出发)的编号为\(nxt[a]\)(为什么不用\(next[a]\)呢,因为next是一个c++自带函数,VScode会判错),第\(a\)条边所去向的节点为\(to[a]\),前面已经输入了\(nm\)条边。
这时候我们新加一条从\(u\)到\(v\)的边的代码如下:
int nm,nxt[M],last[N],to[M];
void addedge(int u,int v) {
nm++;
nxt[nm]=last[u];//在输入这条边之前的最后一条边就是你要指向的上一条边
last[u]=nm;//千万不能和上面的互换,这样你的最后一条边就是自己了
to[nm]=v;
}
这时候我们想查找以\(x\)为起点的边的代码如下:
for(int i=last[x];i!=0;i=nxt[i])
注意:
- 边的编号要从1开始,要不然判断会有大问题。
- 链式前向星存储的是单向边,如果是无向边,记得加成两条单向边,这时候边的数组的大小开两倍
标签:一条,last,浅谈,链式,条边,前向星,nm 来源: https://www.cnblogs.com/konjakhzx/p/16056402.html