其他分享
首页 > 其他分享> > 浅谈前向星

浅谈前向星

作者:互联网

目录

前向星

思路

前向星跟邻接表非常像,但是邻接表是二维数组,而前向星是一位数组,他就是把每个都在一维数组中留足空间,记录头和尾,其实这个前向星像是在为后文的链式前向星做铺垫。

链式前向星

思路

链式前向星就是动态开点的前向星,因为前向星要给所有可能的边留足空间,所以会有许多空间浪费,占用大量空间。此时我们可以动态开边,用多少条边就开多少的空间。

首先,我们知道,前向星是记录头和尾,我们可以这样想,我们让每一条边都记录上一条输入的从同一起点出发的边的编号,也就是说,我们只要记录尾,就可以遍历以某个节点为起点的所有的边。

这时候我们就没有必要保留它的顺序了,因为你每一条边都可以找到上一条输入的边,不论怎样顺序,都可以找到。

我们设以\(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])

注意:

标签:一条,last,浅谈,链式,条边,前向星,nm
来源: https://www.cnblogs.com/konjakhzx/p/16056402.html