今天我们翻开新的篇章,来看一看另一种全新的数据结构——图。图是多对多的关系,在平时也是经常见到的,应用也很广泛,后面我们要讲到的生成树和最短路径,拓扑排序都与图的内容有关。
下面一起来看看图的基础知识吧
1.概念:
图是由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V,E),其中G表示一个图,V是图G中顶点的集合,E是图G中边的集合。
若顶点vi到vj之间的边没有方向,则这条边为无向边,表示为(vi,vj)或(vj,vi),反之为有向边(或弧),表示为<vi,vj>,其中vi称为弧尾,vj称为弧头。总是弧尾指向弧头
若图中所有边都为无向边,则该图为无向图,反之若都为有向边,则为有向图。
简单图:不存在顶点到其自身的边,且同一条边不重复出现。
无向完全图:任意两个顶点中都存在边的无向图。若顶点为n个,则边数为n(n-1)/2。
有向完全图:任意两个顶点中都存在边的有向图。若顶点为n个,则边数为n(n-1)。
稀疏图和稠密图:有很少条边或弧的图称为稀疏图,反之称为稠密图。
权:与边或弧相关的数;带有权的图称为网
相邻且有边直接连接的两个顶点称为邻接点
无向图中,顶点所连边的数目称为度
在有向图中,由于边有方向,则顶点的度分为入度和出度,以顶点i为终点的边的数目,叫做入度,以顶点i为始边的边的数目,叫做出度。
无向图中,从顶点vi到顶点vj的路径是一个顶点序列,路径的长度为经过的边或弧的数目。第一个顶点和最后一个顶点相同的路径称为回路或环。序列中不出现重复的顶点称为简单路径。,除了第一个顶点和最后一个顶点外,其余顶点不重复的路径称为简单回路
路径长度:不带权的图,等于路径上边的条数,带权的图,等于各个边权值的总和。
生成树:一个无向连通图的最小连通子图叫做改图的生成树
2.图的存储结构:主要有四种存储结构:邻接矩阵,邻接多重表,十字链表
(1)无向图的领接矩阵:
有向图的领接矩阵:
h
注意有向图是从列发出到行的。
网(即有权图)的 领接矩阵
领接矩阵的建立:
具体实现:
有向图在创建时要注意和无向图的区别
(2)邻接表
(1)无向图的领接表
两个结点顺序是可以互换的
若有权值,则再加上一个表示权值的结构info
邻接表的特点:
有向图的领接表
左边的那种是v1指向哪个节点来建立邻接表,右边那种是v1被哪个节点来0建立邻接表。各有优点。
邻接表的创建:
顶点的结点结构表示法:
边的结点结构表示法:
总的图的结构表示法:
这里变量的具体应用场景举例:
具体创建过程:
(生成新节点,再类似于头插法插入,也可以用尾插法插入,两种插入方式得到的邻接表是不同的)
邻接矩阵多用于稠密图,邻接表多用于稀疏图
(3)十字链表,主要解决有向图
以v1为例,firstin是指向那些指向v1的结点,firstout指向那些v1指向的结点。
tailvex全都是那一层字母表示的下标。headvex是v1指向的结点的对应的下标
hlink是指向那个firstin指向它的顶点结点,还有其他指向它的结点。即连接指向v1的结点
tlink是连接那些v1指向的结点
(4)邻接多重表:无向图的另一种链式存储结构
关于图的四种存储结构就在这里了,对于前面两种是要求重点掌握的,邻接矩阵多用于稠密图,邻接表多用于稀疏图,后两种熟悉原理即可。
好啦,关于图的基础知识以及重要的图存储结构就分享到这里啦。特别感谢王卓老师的网课(本篇文章很多用到了她的网课图片),真的是通俗易懂,真的很合适新手学习数据结构,强烈推荐。
本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.