2019/8/1 前向星与链式前向星

    前向星与链式前向星

  前向星与链式前向星两种相似却略有不同的数据结构,主要用途是存储给定图(图论问题)。

  存图方法

  主要方法有以下几种:

  • 邻接表

  • 邻接矩阵

  • 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.

  

原文地址:https://www.cnblogs.com/randomaddress/p/11285563.html