前向星与链式前向星
前向星与链式前向星两种相似却略有不同的数据结构,主要用途是存储给定图(图论问题)。
存图方法
主要方法有以下几种:
-
邻接表
-
邻接矩阵
-
vector
-
前向星
-
链式前向星
前面三种交给亲爱的冯老师(我跟vector有仇)
------>冯老师
这次我们来探讨前向星与他的好兄弟---------链式前向星。
前置知识
-
图论相关
-
基本数据结构(struct)
-
指针(链表)
1.前向星
“一种数据结构,以储存边的方式来存储图。构造方法如下:读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序(可以使用基数排序,如下面例程),前向星就构造完了。通常用在点的数目太多,或两点之间有多条弧的时候。一般在别的数据结构不能使用的时候才考虑用前向星。除了不能直接用起点终点定位以外,前向星几乎是完美的。”------百度百科
结构:
前向星是一种通过存储边来存储图的数据结构,主要部分如下:
1.起点
2.终点
3.边权值
原理/实现方法:
1.输入边信息(起/止/权值)
2.将边以起点为关键字排序,以实现同一起点的边储存在同一区间并且相邻。(遍历时更加方便快速)
优点:
1.见引用部分。
缺点:
1.不能依据起点/终点直接获得边信息。
实际使用:
基本从来从来从来都不会用到(因为有链式前向星)。
2.链式前向星
“如果说邻接表是不好写但效率好,邻接矩阵是好写但效率低的话,前向星就是一个相对中庸的数据结构。前向星固然好些,但效率并不高。而在优化为链式前向星后,效率也得到了较大的提升。虽然说,世界上对链式前向星的使用并不是很广泛,但在不愿意写复杂的邻接表的情况下,链式前向星也是一个很优秀的数据结构。”------百度百科
结构:
链式前向星也是一种通过存储边来存储图的数据结构(Plus),使用了类似链表的思想,主要部分如下:
1.终点
2.权值
3.起点 (不必要,部分场合需要)
4.next指针//重点
5.head数组//表示以某点为起点的最后一条边的序号
原理/实现方法:
1.输入边信息。
2.加边。
1 struct edge 2 {// int from; 3 int nxt;//next指针 4 int to; 5 int dis; 6 }e[400005];//建议4倍 7 void add(int x,int y,int d)//起点,终点,权值 8 { 9 e[++cnt].nxt=head[x];//新边在遍历时的下一条边是head[]指向的以x为起点的最后一条边 10 e[cnt].dis=d; 11 e[cnt].to=y; 12 head[x]=cnt;//更新head,以x结点为起点的最后一条边为新边 13 }//cnt:边计数器
3.遍历(模板)
1 for(int i=head[x];i;i=e[i].nxt)//i相当于遍历边的序号,循环开始时为head指向的以x为节点最后一条边,循环结束时为新边的下一条边,以此形成链表关系 2 { 3 //语句 4 }
优点:
1.用途多样。
2.高逼格。
缺点:
1.较难理解。(不懂欢迎私信)
2.遍历顺序实际操作较难。
实际使用
1.OI中最常用的存图方法之一。
2.有必要熟练到默写的程度。
over.