浅谈前向星

前向星

思路

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

链式前向星

思路

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

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

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

我们设以 x x x为节点的最后一条输入的边为 l a s t [ x ] last[x] last[x],第 a a a 条边的上一条边(以同一节点出发)的编号为 n x t [ a ] nxt[a] nxt[a](为什么不用 n e x t [ a ] next[a] next[a] 呢,因为 n e x t next next 是一个 c++ \text{c++} c++ 自带函数, VScode \text{VScode} VScode 会判错),第 a a a 条边所去向的节点为 t o [ a ] to[a] to[a],前面已经输入了 n m nm nm 条边。

这时候我们新加一条从 u u u v v 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 x x 为起点的边的代码如下:

for(int i=last[x];i!=0;i=nxt[i])

注意:

  • 边的编号不能从 0 0 0 开始,要不然判断会有大问题。
  • 链式前向星存储的是单向边,如果是无向边,记得加成两条单向边,这时候边的数组的大小开两倍

你可能感兴趣的:(图论,前向星,链式前向星,图论,c++)