洛谷模板.Floyd的深度理解(python)

 先上代码:

n, m = map(int, input().split())
edge = [ [float('inf')]*n for _ in range(n)]
for i in range(m):
    u, v, w = map(int, input().split())
    edge[u-1][v-1] = min(edge[u-1][v-1], w)
    edge[v-1][u-1] = min(edge[v-1][u-1], w)
for i in range(n):
    edge[i][i] = 0
for k in range(n):
    for i in range(n):
        for j in range(n):
            edge[i][j] = min(edge[i][j], edge[i][k] + edge[k][j])
for i in range(n):
    for j in range(n):
        print(edge[i][j], end=' ')
    print()

floyd算法知道长什么样,就是三层for循环呗,但是理解起来不是很简单。

为什么要进行三层循环,因为三层循环之后,从节点i到节点j的所有路径都遍历了一遍,找到最小值。

我们节点i到节点j的最短路径(现在节点i和节点j是某两个节点,已经固定)考虑算法首先初始化,

如果i和j直接存在路径,那么edge[i][j] = w。或者不存在路径,edge[i][j]=inf。

现在开始第一层循环,k = 1:

        不考虑i==k和j==k的情况(毕竟如果相等,那么edge[i][j]任然等于w或者inf),现在i!=k and j!=k,那么edge[i][j] = min(edge[i][j], edge[i][k] + edge[k][j]),取值为节点i到j的情况,和节点i到k到j的情况,这里我就简写,i-j 和 i-1-j

k = 2:

        edge[i][j] = min(edge[i][j], edge[i][2] + edge[2][j]),这里面存在 i-j,和i-2-j的情况,只有这两个吗???第一重循环中,已经计算了任意两个节点以节点1为桥的情况,那么现在全部情况应该是:i-j, i-1-j, i-2-j, i-1-2-j, i-2-1-j 这五种情况。

k = ....

k取完1-n之后,edge[i][j] 表示从节点i到节点j的所有可能存在的路径的最小值。

所以Floyd能奏效。

相关推荐

  1. 】【模板】排序

    2024-05-16 08:12:13       65 阅读
  2. honoka键盘#

    2024-05-16 08:12:13       58 阅读
  3. 深入理解pythonsubprocess模块

    2024-05-16 08:12:13       28 阅读
  4. P3865 【模板】ST 表

    2024-05-16 08:12:13       38 阅读
  5. Floyd-Warshall算法Python实现

    2024-05-16 08:12:13       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-16 08:12:13       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-16 08:12:13       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-16 08:12:13       87 阅读
  4. Python语言-面向对象

    2024-05-16 08:12:13       96 阅读

热门阅读

  1. 入门篇:Kafka基础知识·

    2024-05-16 08:12:13       37 阅读
  2. K-means 算法【python,算法,机器学习】

    2024-05-16 08:12:13       36 阅读
  3. mediasoup源码分析(三)--日志模块

    2024-05-16 08:12:13       28 阅读
  4. [前端|vue] !important 关键字使用说明(笔记)

    2024-05-16 08:12:13       35 阅读
  5. 导出docker中gitlab的数据

    2024-05-16 08:12:13       29 阅读
  6. [linux] bash中的单引号(‘)和双引号(“)

    2024-05-16 08:12:13       28 阅读
  7. Hadoop、MapReduce、YARN和Spark的区别与联系

    2024-05-16 08:12:13       34 阅读
  8. Spring的IOC(Inversion of Control)设计模式

    2024-05-16 08:12:13       27 阅读
  9. AI学习指南概率论篇-贝叶斯推断

    2024-05-16 08:12:13       35 阅读