【C++】Floyd算法


399. 除法求值icon-default.png?t=N7T8https://leetcode.cn/problems/evaluate-division/

算法介绍:

        Floyd算法,也称为Floyd-Warshall算法,是一种动态规划算法,用于在具有正或负边权(但没有负循环)的加权图中找到最短路径。它以罗伯特·弗洛伊德(Robert Floyd)的名字命名,他在1962年独立发现了该算法,并以斯蒂芬·沃沙尔(Stephen Warshall)的名字描述了用于找到图的传递闭包的版本。

        该算法通过迭代更新一个n×n的矩阵,其中包含图中所有顶点对之间的最短路径距离,其中n是顶点的数量。它首先用图中边的权重初始化矩阵,然后通过考虑所有可能的中间顶点来迭代改进估计值。

Floyd算法具体实现包括以下几个步骤:

  1. 初始化距离矩阵:将图中的边权重填充到一个初始的n × n矩阵中,其中n是顶点的数量。如果两个顶点之间有直接的边,则矩阵中对应位置的值为该边的权重;否则将其置为无穷大或足够大的值。同时,对角线上的元素应该为0,表示同一个顶点到自身的距离为0。

  2. 迭代更新距离矩阵:对于每一对顶点 (i, j),以及可能的中间顶点k,检查是否可以通过k点使得从i到j的距离更短。如果可以,则更新距离矩阵中(i, j)的值为经过顶点k的更短路径的长度。具体来说,就是对于每个顶点k,遍历所有的顶点对(i, j),并检查是否存在一条路径从i到k再到j的距离小于直接从i到j的距离。

  3. 重复迭代:重复执行上述步骤,直到没有任何顶点可以通过添加中间顶点使得路径更短为止。在每次迭代中,距离矩阵都会被更新以反映新的最短路径。

通过这种方法,最终的距离矩阵将包含图中所有顶点对之间的最短路径长度。

以下是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];
                }
            }
        }
    }

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值