399. 除法求值https://leetcode.cn/problems/evaluate-division/
算法介绍:
Floyd算法,也称为Floyd-Warshall算法,是一种动态规划算法,用于在具有正或负边权(但没有负循环)的加权图中找到最短路径。它以罗伯特·弗洛伊德(Robert Floyd)的名字命名,他在1962年独立发现了该算法,并以斯蒂芬·沃沙尔(Stephen Warshall)的名字描述了用于找到图的传递闭包的版本。
该算法通过迭代更新一个n×n的矩阵,其中包含图中所有顶点对之间的最短路径距离,其中n是顶点的数量。它首先用图中边的权重初始化矩阵,然后通过考虑所有可能的中间顶点来迭代改进估计值。
Floyd算法具体实现包括以下几个步骤:
-
初始化距离矩阵:将图中的边权重填充到一个初始的n × n矩阵中,其中n是顶点的数量。如果两个顶点之间有直接的边,则矩阵中对应位置的值为该边的权重;否则将其置为无穷大或足够大的值。同时,对角线上的元素应该为0,表示同一个顶点到自身的距离为0。
-
迭代更新距离矩阵:对于每一对顶点 (i, j),以及可能的中间顶点k,检查是否可以通过k点使得从i到j的距离更短。如果可以,则更新距离矩阵中(i, j)的值为经过顶点k的更短路径的长度。具体来说,就是对于每个顶点k,遍历所有的顶点对(i, j),并检查是否存在一条路径从i到k再到j的距离小于直接从i到j的距离。
-
重复迭代:重复执行上述步骤,直到没有任何顶点可以通过添加中间顶点使得路径更短为止。在每次迭代中,距离矩阵都会被更新以反映新的最短路径。
通过这种方法,最终的距离矩阵将包含图中所有顶点对之间的最短路径长度。
以下是C++实现迭代更新距离矩阵(核心部分):
for (int k = 0; k < n; ++k) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
// 如果经过k点到达j点的路径比直接到达j点的路径短,则更新距离矩阵
if (dist[i][k] != INF && dist[k][j] != INF && dist[i][k] + dist[k][j] < dist[i][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}