一、图的最短路径
从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径
图的最短路径有许多重要的应用。
例如:上图中v0-v8有9个点,可以看做不同的地点,现在要规划出v0到其它某个点地点的最短路线规划
构建最短路径中比较常见的一种算法即为dijstra(迪杰斯特拉)算法
二、dijstra(迪杰斯特拉)算法
算法思路:
- dijstra算法思路有点类似前一篇文章中的prim算法,先构建图的邻接矩阵,然后定义一个临时的一维数组,一维数组用来存储v0到每个顶点的最短路径
- 将一维数组初始化成v0到每个顶点的值。其次定义另外一个数组用来存储已经访问过的顶点
- 在临时一维数组中找到未被访问且最短的一条路径
- 将找到最短路径的顶点与该顶点可访问边进行遍历,若最短路径与边之和小于一维数组中存储的最短路径,则将这个和覆盖成这个顶点的最短路径
- 循环3,4直至遍历完所有顶点为止
- 构建邻接矩阵
1 | // 初始化图 |
- 算法代码
1 | /** |
- 即可得到v0到每个点的最短路径的值
三、拓扑排序
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。
简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
对以下有向图进行拓扑排序,顶点可以看待成每项不同的任务,有的任务可以直接执行,例如v0、v1、v3,有的任务得等到上级任务全部执行完成才可执行,例如v4必须等到v0和v1都完成之后才可执行
排序思路:
- 观察可以发现顶点入度为0则代表可以直接执行
- 完成一个任务之后可消除出度的边,即他的next节点则少了一个入度
- 带next节点入度也为0之后就可执行
- 循环1,2,3遍历完所有的顶点即可排序完成
排序代码:
- 构建每个顶点的邻接表
- 算法代码
1 | /** |