ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

浅谈前向星

2022-03-25 20:03:46  阅读:161  来源: 互联网

标签:一条 last 浅谈 链式 条边 前向星 nm


目录

前向星

思路

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

链式前向星

思路

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

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

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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有