Floyd

简介: 复习acwing算法基础课的内容,本篇为讲解基础算法:Floyd,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。

文章目录

前言

一、什么是Floyd算法

二、AcWing 854. Floyd求最短路

本题分析

AC代码

三、时间复杂度


前言

复习acwing算法基础课的内容,本篇为讲解基础算法:Floyd,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。


一、什么是Floyd算法

计算最短路算法的一种,相较于Dijkstra,bellman-ford,spfa,Floyd算法是计算多源最短路问题的算法,下图来自AcWing算法基础课:

image.png

二、AcWing 854. Floyd求最短路

本题链接:AcWing 854. Floyd求最短路

本博客给出本题截图:

image.png

本题分析

dist数组的含义是两点之间的距离,例如dist[i][j]代表的是从i点到j点的距离


这里也同样解释一下为什么写成if (dist[a][b] > INF / 2)

和bellman-ford算法写成这样的原因一致,因为我们存在负权边,所以就算是两个正无穷的边在更新的时候,正无穷和正无穷之间的边权为负,那么另一个正无穷被更新的时候会是正无穷减去一个数,小于INF,故我们直接要求dist[a][b] > INF / 2即可.


算法核心:

void floyd()
{
    for (int k = 1; k <= n; k ++ )
        for (int i = 1; i <= n; i ++ ) 
            for (int j = 1; j <= n; j ++ )
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}

AC代码

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 210, INF = 1e9;
int dist[N][N];
int n, m, k;
void floyd()
{
    for (int k = 1; k <= n; k ++ )
        for (int i = 1; i <= n; i ++ ) 
            for (int j = 1; j <= n; j ++ )
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
int main()
{
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= n; j ++ ) 
            if (i == j) dist[i][j] = 0;
            else dist[i][j] = INF;
    while (m -- )
    {
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        dist[x][y] = min(dist[x][y], z);
    }
    floyd();
    while (k -- )
    {
        int a, b;
        scanf("%d%d", &a, &b);
        if (dist[a][b] > INF / 2) puts("impossible");
        else printf("%d\n", dist[a][b]);
    }
    return 0;
}

三、时间复杂度

关于Floyd算法的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。



目录
相关文章
|
存储 缓存 内存技术
USB容量大小对传输速度影响有多大
USB容量大小对传输速度影响有多大
USB容量大小对传输速度影响有多大
|
搜索推荐 API
LangChain-16 Using Tools LangChain封装好的工具集tools
LangChain-16 Using Tools LangChain封装好的工具集tools
223 5
|
Kubernetes 数据安全/隐私保护 数据中心
如何在 Kubernetes 中使用命名空间
【8月更文挑战第11天】
798 0
如何在 Kubernetes 中使用命名空间
|
人工智能 算法 自动驾驶
人工智能浪潮中的伦理困境:技术发展与道德责任的平衡
在人工智能技术飞速发展的今天,我们面临着前所未有的伦理挑战。本文深入探讨了AI技术带来的伦理问题,包括数据隐私、算法偏见和自动化失业等。通过分析这些挑战,本文提出了一系列解决策略,旨在促进AI技术的健康发展,同时保护人类社会的福祉。
|
监控 JavaScript 前端开发
Axure实战16:使用Axure和JavaScript引用Echarts图表
Axure实战16:使用Axure和JavaScript引用Echarts图表
1454 0
Axure实战16:使用Axure和JavaScript引用Echarts图表
|
数据采集 数据挖掘 数据处理
pandas数据清洗之处理缺失、重复、异常数据
在数据分析和建模的过程中,有相当多的时间要用在数据准备上:加载、清理、转换以及重塑。这些工作会占到分析师时间的80%或更多。幸运的是pandas和内置的Python标准库提供了高效、灵活的工具可以帮助我们轻松的做这些事情。 本文重点介绍通过pandas进行数据的清洗。数据处理中的清洗工作主要包括对需要分析的数据集中的缺失值(空值)、重复值、异常值的处理。
895 0
[UE 虚幻引擎] DTLoadFbx 运行时加载FBX本地模型插件说明
该插件支持在运行时动态加载FBX模型,无需预先打包。通过新建Actor并添加DT Runtime Fbx Component,然后调用LoadFile函数加载模型路径(不支持动画)。加载时可选择是否创建碰撞体,该组件基于UProceduralMeshComponent,提供与PMC相似的设置。启用异步计算(Use Async Cooking)可加速碰撞体生成。
673 0
|
JavaScript Java 测试技术
基于小程序的个人健康数据管理系统+springboot+vue.js附带文章和源代码设计说明文档ppt
基于小程序的个人健康数据管理系统+springboot+vue.js附带文章和源代码设计说明文档ppt
261 0
Windows Server 各版本搭建 Web 服务器实现访问本地 Web 网站(03~19)
Windows Server 各版本搭建 Web 服务器实现访问本地 Web 网站(03~19)
|
算法 编译器 C语言
【C/C++ 编译器的差异化】C++标准库在GCC和VS之间的表现差异
【C/C++ 编译器的差异化】C++标准库在GCC和VS之间的表现差异
1485 1