一、算法介绍
迪杰斯特拉算法是一种用于在带权有向图或无向图中寻找从一个特定源节点到其他所有节点的最短路径的算法。它属于贪心算法的一种,通过不断选择当前距离源节点最短距离的节点,并更新其相邻节点的距离信息,直到找到所有节点的最短路径。
算法原理
- 初始化:
- 设源节点为 ,将源节点到自身的距离设为 ,即 。
- 对于其他所有节点 ,将其距离设为无穷大,即 。
- 创建一个集合 ,用于存储已经找到最短路径的节点,初始时 。
- 迭代过程:
- 对于不在集合 中的每个节点 ,更新其到源节点的距离估计值。即对于从源节点经过集合 中的节点到达 的路径,如果这条路径的长度小于当前记录的 ,则更新 。
- 选择不在集合 中且距离 最小的节点 ,将其加入集合 。
- 重复上述步骤,直到所有节点都在集合 中。
数据结构
- 距离数组:使用一个数组(或列表)来存储每个节点到源节点的当前最短距离估计值。
- 前驱节点数组:用于记录每个节点在最短路径上的前驱节点。这有助于在找到最短路径后重构路径。
- 优先队列(可选):在实现中,为了高效地找到距离最小的节点,可以使用优先队列。但也可以通过简单地遍历所有不在集合 中的节点来实现。
二、案例
考虑下面一个简单的带权无向图: