为什么有狄克斯特拉算法
这里的时间,换句话,我们给边加上了权重
- 之前 BFS 求出了最短路径,那么如果我们给边加上了时间呢?
- 发现最短路径并不是最快路径
步骤
- 找出最便宜的节点,就是说可以在最短时间内到达的节点(算法关键)
- 更新该节点的邻居的开销,检查是否有前往他们的更短路径,有就更新
- 重复这个过程,直到对图中的每个节点都这样做了
- 计算最终路径
术语
- 权重:狄克斯特拉算法用于每条边都有关联数字的图,这些关联数字叫做权重
- 带权重的图叫做加权图,计算最短路径用狄克斯特拉算法
- 不带权重的叫非加权图,计算最短路径用广度优先搜索
- 图还可能有环
- 负权边:权重是负的。
- 有负权边的情况,不能使用狄克斯特拉算法。因为该算法这样假设:对于处理过的节点,没有前往该节点的更短路径,只要在没有负权边才成立。应该使用贝尔曼-福德算法。
算法实现
- 需要三个散列表
- 图的散列表
- 节点的开销的散列表
- 存储父节点的散列表
- 需要一个数组,用于记录处理过的节点,不用多次处理
1 | //如何表示加权图 |