java 有向无环图 权重计算实现 指定开始节点 结束节点 有向无环图 python_邻接矩阵


前言

之前写的数据结构内容都删了,因为好多内容太水了,要不就是断更,虽然这篇也水 - -

图是一种多对多的数据结构,图由顶点(V)和边(E)组成。

图的分类

  1. 无向图 (v1,v2) 两个点互通, 边没有方向就是无向图
  2. 有向图(v1,v2) v1是起点,v2是终点,只能v1到v2, v2不能到v1的图就是有向图
  3. 完全图 边是n(n-1)/2,每对顶点之间有一条边
  4. 稀疏图 |E|<|V^2|的图
  5. 稠密图 |E| 接近 |V^2|的图
  6. 权重图(网络) 每条边上带有相关的权重的图

图的顶点有度

  1. 度: 所有和它连接的点个数之和
  2. 入度: 在有向图中,所有接入这个点的边数之和
  3. 出度: 在有向图中, 所有接出这个点的边数之和

创造图

  1. 邻接矩阵(邻接矩阵的优缺点) 适合完全图, 权重图
  2. 邻接表(邻接表的优缺点)适合稀疏图

邻接矩阵

在稠密图的时候,可以用邻接矩阵来表示,这样不会造成空间浪费,同时可以快速判断两个点之间是否有边连接,邻接矩阵的空间复杂度最坏情况是Θ(V^2)。

邻接表

邻接表表长是2|E|, 不管是有向图还是无向图空间复杂度都是Θ(V+E), 虽然空间复杂度比邻接矩阵小,但是查找效率没有邻接矩阵快。

图的遍历

  1. DFS(深度优先搜索) 和树的先序遍历差不多
  2. 使用栈和递归/回溯
  3. BFS(广度优先搜索) 树的层序遍历
  4. 使用队列

DFS 深度优先搜索

从图中某个点出发,接着找到下一个点,重复之前两个动作,直到图中所有的点都被访问过了,和树的先序遍历一样,如果某个点走不通了,就要回到之前的点,这个操作称为回溯。

BFS 广度优先搜索

假定一个图(V,E)和一个起点a,从起点a走完整个图,再走的过程中会产生一颗广度搜索树,源点作为根节点,配合队列实现,源点a进入队列,只要队列不为空,BFS就不会停止,出队的时候,取队头a,接着访问a的邻接顶点,重复之前的动作。