图
定义
由顶点的有穷非空集合和顶点之间的边的集合组成。
个人翻译:点之间连着线就是图
数据结构间的区别
线性表:一对一,只有前驱和后驱
树:一对多,一个结点对应多个子节点,一个根节点
图:多对多,多个顶点对应多个顶点
图的分类
无向图
若顶点到
之间的边没有方向,那么这条边就是无向边
如果图中任意两个结点之间的边都是无向边,则称为无向图
无向图顶点的边数叫做顶点的度
有向图
若从顶点到
的边有方向,则称这条边为有向边,也称为弧
如果图中任意两个顶点之间的边都是有向边,则称该图为 有向图
指向自己的边的条数称为顶点的入度,由自己指出去的边的条数称为出度
简单图
在图中,若不存在顶点到其自身的边**,且**同一条边不重复出现,则称这样的图为简单图
无向完全图
在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图
有向完全图
在有向图中,如果任意两个顶点之间都存在 方向互为相反 的两条弧,则称该图为有向完全图
权
有些图的边或弧具有相应的权值,这种与图的边有关的数被称为权
带权的图一般被称之为网
个人翻译:好比两个点之间有路,路就是图的边,而距离就是这条边的权
连通图
图中顶点间存在路径,两顶点存在路径则说明是连通的
没有重复顶点的路径称为简单路径
无向
如果无向图中任意两个结点是连通的,则称之为连通图
有向
有向连通图分为弱连通,单向连通,强连通
弱连通:有向图的底图(无向图)是连通图,则是弱连通图
单向连通:有向图中,任意两个结点至少有一个到另一个是可达的,则是单向连通图
强连通:有向图中,任意两个结点互相可达,则该图为强连通图
图的存储结构
计算机只认识01,所以我们不可能在cpu上面画一个图然后逼着cpu完成运算
于是便有了图的存储结构,和线性表一样,图的存储结构也分为两种分别是:邻接矩阵,邻接表
邻接矩阵
图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
邻接表
用单链表和顺序存储的方式来存放图
这个存储结构比较复杂,我觉得我会讲错,所以摆烂了,想要学习的可以去看看这位大佬的
https://blog.csdn.net/m0_46518461/article/details/109547298?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164234707816780366572788%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=164234707816780366572788&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-109547298.pc_search_result_control_group&utm_term=%E5%9B%BE%E7%9A%84%E5%AD%98%E5%82%A8%E7%BB%93%E6%9E%84&spm=1018.2226.3001.4187
图的遍历
图的遍历也是有两种方法,分别是深度优先遍历,广度优先遍历
深度优先遍历
由名字可得优先向前访问
首先以一个未被访问过的顶点作为起始顶点沿当前顶点的边走到未访问过的顶点
当没有未访问过的顶点时则回到上一个顶点继续试探别的顶点,直至所有的顶点都被访问过
广度优先遍历
同样由名字可得优先对一个结点指向的其他所有未被访问的结点进行遍历
依次将访问到的顶点放入队列,然后依次访问他们的下一个结点,访问到的均放入队列
直到队列为空,整个图访问结束
可以用来解最短路径问题
最小生成树
最小生成树包含两种算法,分别是普利姆算法和克鲁斯卡尔算法,由于我实在懒的画图所以也粘一篇大佬的文章了
https://blog.csdn.net/liu17234050/article/details/104262387
拓扑排序
这个很简单,只要按着以下步骤走就没问题
1.寻找未被指向的结点,将他取出(若有多个选其一)
2.去除取出的结点和与它相连的线
3.执行第一步
4.直到整个图都完成排序
ails/104262387
拓扑排序
这个很简单,只要按着以下步骤走就没问题
1.寻找未被指向的结点,将他取出(若有多个选其一)
2.去除取出的结点和与它相连的线
3.执行第一步
4.直到整个图都完成排序
本笔记包含大量本人看法和理解,如果有什么遗漏或是错误,欢迎私信指正,谢谢!!!!