Floyd算法——AcWing 343. 排序

目录

Floyd算法

定义

运用情况

注意事项

解题思路

基本步骤

AcWing 343. 排序 

题目描述

运行代码

代码思路

改进思路

Floyd算法

定义

Floyd算法,全称Floyd-Warshall算法,是一种用于解决图中所有顶点对之间的最短路径问题的动态规划算法。它适用于带权有向图,且可以处理负权重边(但不能处理含有负权重循环的图),并能够检测出图中是否存在负权重循环。

运用情况

  1. 计算所有顶点对之间的最短路径:在诸如社交网络分析、交通网络规划、通信网络设计等领域,需要计算任意两点间的最短距离时,Floyd算法是一个很好的选择。
  2. 检测负权重循环:在某些应用场景下,需要确保图中不存在负权重循环,因为这可能表示系统中的某种异常或错误状态。

注意事项

  • 内存消耗:Floyd算法的空间复杂度为O(n^2),其中n是图中顶点的数量。对于大规模图,这可能成为一个问题。
  • 时间复杂度:Floyd算法的时间复杂度为O(n^3),在顶点数量很大的情况下,算法可能会变得非常慢。
  • 负权重循环:如果图中存在负权重循环,Floyd算法会陷入无限循环,因为从一个节点出发,通过该循环可以无限次减少路径长度。在实际应用中,需要先检测并处理这类情况。
  • 算法可以检测负权重循环:如果在算法执行过程中发现某个顶点到自身的最短路径小于0,即D[i][i] < 0,那么图中存在至少一个负权重循环,此时算法无法给出正确的最短路径结果。
  • 对于非常大的图,算法的高时间复杂度和空间复杂度可能成为瓶颈,这时可能需要考虑更高效的算法或者使用更专业的数据结构和优化技术。

解题思路

Floyd算法的核心思想是动态规划,其基本步骤如下:

  1. 初始化:将距离矩阵D设置为图的邻接矩阵,即D[i][j] = weight(i, j);对于i != j,如果(i, j)不连通,则D[i][j] = ∞;D[i][i] = 0。
  2. 动态规划:对于k = 1 到 n,更新D,使得D[i][j] = min(D[i][j], D[i][k] + D[k][j]),即检查是否可以通过中间节点k来缩短i到j的距离。
  3. 结果:最终的D矩阵包含了所有顶点对之间的最短路径长度。如果存在某个D[i][j] < 0且i != j,在更新过程中出现了D[i][i] < 0的情况,说明图中存在负权重循环。

Floyd算法的实现通常使用三重循环,外层循环遍历所有的中间顶点k,内两层循环遍历所有顶点对(i, j),检查是否存在更短路径。

基本步骤

假设我们有一个带权图G,其中包含n个顶点,我们可以用一个二维数组dist[][]来存储每对顶点之间的最短路径长度。初始时,dist[i][j]被设定为图中直接相连的边的权重,如果i和j之间没有直接相连的边,则dist[i][j]被设定为无穷大(表示不可达)。

  1. 初始化:创建一个n×n的矩阵D,其中D[i][j]初始化为图中从i到j的直接边的权重,如果i和j之间没有直接边,则设为无穷大。对角线元素D[i][i] = 0。

  2. 动态规划:对于每个顶点k(作为中间顶点),更新每对顶点i和j之间的最短路径,以k为中间点可能获得更短路径。更新公式为:D[i][j] = min(D[i][j], D[i][k] + D[k][j])。这意味着,如果通过k作为中间顶点,从i到j的路径变得更短了,就更新D[i][j]。

  3. 结果输出:经过n轮迭代后,矩阵D中的每个元素D[i][j]即为从i到j的最短路径长度。

AcWing 343. 排序 

题目描述

343. 排序 - AcWing题库

运行代码

#include <algorithm>
#include <bits/stdc++.h>
#include <iostream>
using namespace std;#define PII pair<int, int>
#define fi first
#define se second
#define endl '\n'
map<int, int> mp;const int N = 210, mod = 1e9 + 7;
int T, n, m, k;
int a[N], dist[N][N];
PII ans[N];void floyd(int x) // 以 x 为中转点,更新其他点。
{for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)dist[i][j] = min(dist[i][j], dist[i][x] + dist[x][j]);
}bool pd() // 判断是否所有点都已确定
{for (int i = 1; i <= n; i++) {int cnt = 0;for (int j = 1; j <= n; j++)if (dist[i][j] != 1e9)cnt++; // 当前点能到达的点数ans[i] = {cnt, i};for (int j = 1; j <= n; j++)if (i != j && dist[j][i] != 1e9)cnt++; // 能到达当前点的点数if (cnt != n)return 0;}sort(ans + 1, ans + n + 1);return 1;
}int main() {while (cin >> n >> m && n) {for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)if (i != j)dist[i][j] = 1e9;int flag = 0;for (int i = 1; i <= m; i++) {char a, t, b;cin >> a >> t >> b;int x = a - 'A' + 1, y = b - 'A' + 1; // 现在要加一条从 y 到 x 的边if (!flag && dist[x][y] != 1e9) // 发现已经从x能到y,出现矛盾{printf("Inconsistency found after %d relations.\n", i);flag = 1;}dist[y][x] = 1;floyd(x), floyd(y); // 分别以 x 和 y 为中转点更新其他点if (!flag && pd()) { // 发现所有点都已确定printf("Sorted sequence determined after %d relations: ", i);for (int i = 1; i <= n; i++)cout << char(ans[i].se + 'A' - 1);printf(".\n");flag = 1;}}if (!flag)printf("Sorted sequence cannot be determined.\n"); // 无法确定}return 0;
}

代码思路

  1. 初始化: 使用一个dist二维数组初始化为无穷大,表示不等式间默认没有确定的顺序关系。
  2. 读取输入: 从标准输入读取关系,格式为“B > A”,表示B优于A。
  3. 关系处理:
    • 当读取到新的关系时,检查是否有矛盾(即之前已确定的关系与新关系冲突)。
    • 更新dist矩阵,使用Floyd算法更新所有不等式之间的最短路径,这里实际上是更新“优先级”或“排序”的关系。
  4. 检查排序确定性:
    • 检查是否所有不等式之间的关系都已经确定,即每个点都能到达其他所有点,且路径长度不是无穷大。
    • 如果在读取关系的过程中就发现了排序确定,或者读取完所有关系后仍然无法确定排序,输出相应信息。

改进思路

  • 效率提升: 当前的floyd调用在每次添加新关系后立即进行,这可能不是必要的。可以等到所有关系读取完毕后再进行一次Floyd算法,以减少不必要的计算。
  • 简化逻辑: 目前的代码在检测矛盾和确定排序完成的逻辑较为复杂。可以尝试简化逻辑,比如使用更直观的数据结构或算法步骤来检查这些条件。
  • 代码清晰性: 可以增加注释和代码结构的清晰度,使得代码更易于理解和维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/46760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于java+springboot+vue实现的实验室管理系统(文末源码+Lw)127

基于SpringBootVue的实现的实验室管理系统&#xff08;源码数据库万字Lun文流程图ER图结构图演示视频软件包&#xff09; 系统功能&#xff1a; 实验室管理系统 管理员功能有个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;公告信息管理&#xff0c;知识库管理…

杭州高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

杭州高校大学智能制造数字孪生技术作为智能制造的重要支撑&#xff0c;通过构建虚拟世界的镜像&#xff0c;实现对物理世界的实时监控、预测和优化。杭州高校大学智能制造实验室数字孪生可视化系统平台建设项目&#xff0c;旨在通过引入先进的数字孪生技术&#xff0c;构建一个…

ESP32-S3多模态交互方案在线AI语音设备应用,启明云端乐鑫代理商

随着物联网&#xff08;IoT&#xff09;和人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;嵌入式设备正逐渐变得智能化&#xff0c;让我们的家庭生活变得更加智能化和个性化。 随着大型语言模型的不断进步和优化&#xff0c;AI语音机器人设备能够实现更加智能、…

自定义 Java ClassLoader:深入探索

在 Java 应用程序中&#xff0c;类加载器&#xff08;ClassLoader&#xff09;是实现动态加载类和资源的关键组件。默认情况下&#xff0c;Java 提供了一个类加载器层次结构&#xff0c;但有时我们需要自定义类加载器来满足特定的需求&#xff0c;比如加载加密的类文件、从数据…

Springboot + JWT 的 Token 登录验证

目录 项目结构 一、 引入依赖 二、自定义Auth认证注解 三、 编写登录拦截器 四、定义跨域拦截器 五、 定义全局异常处理器 六、定义工具类 1. 统一错误状态码 2.统一响应类 3.Token工具类 七、 编写实体类 八、 定义控制器 1.定义登录控制器类 2 定义报错处理器 …

【单片机毕业设计选题24067】-基于STM32的智能衣控制系统

系统功能: 系统上电后OLED显示“欢迎使用智能衣服系统请稍后”两秒钟后进入正常页面显示&#xff0c; 第一行显示系统状态信息 第二行显示获取到体温值 第三行显示设定的高体温阈值和低体温阈值 第四行显示获取到心率和血氧值 短按B3按键调高心率设定高阈值 短按B4按键调…

【学术会议征稿】2024年第三届信息学,网络与计算技术国际学术会议(ICINC2024)

2024年第三届信息学&#xff0c;网络与计算技术国际学术会议(ICINC2024) 2024 3rd International Conference on Informatics,Networking and Computing (ICINC 2024) 2024年第三届信息学&#xff0c;网络与计算技术国际学术会议(ICINC2024)将于2024年10月25-27日于中国郑州召…

Vue中使用mind-map实现在线思维导图

概述 在前面的文章Vue中实现在线画流程图实现中介绍了流程图的在线绘制&#xff0c;在本文&#xff0c;给大家分享一下基于mind-map实现在线的思维导图&#xff0c;并实现&#xff1a;1. 导图导出为图片&#xff1b;2. 打开xmind文件。 实现效果 实现 1. mind-map简介 simp…

使用Druid完成SpringBoot集成MySql、DM(达梦)数据库数据源操作

业务背景 一个方法里&#xff0c;对A数据源需要进行查询&#xff0c;B数据源进行插入(切面插入访问数据&#xff0c;日志)。 详细业务是查询业务数据&#xff0c;同时主数据库记录访问日志。 第一步依赖先行 <dependency><groupId>mysql</groupId><art…

正确选择指挥中心操作台厂家的因素

在当今数字化和信息化快速发展的时代&#xff0c;指挥中心操作台在各类机构和企业的运营中发挥着至关重要的作用。然而&#xff0c;选择一个合适的指挥中心操作台厂家并非易事。以下是一些选择指挥中心操作台厂家的考虑因素。 一、产品质量与工艺 要考察厂家的产品质量和工艺水…

C语言中的指针:掌握内存的钥匙

C语言中的指针&#xff1a;掌握内存的钥匙 引言 C语言是一种结构化编程语言&#xff0c;它提供了对硬件底层的直接访问&#xff0c;其中最强大的特性之一就是指针。指针允许程序员直接操作内存地址&#xff0c;这对于理解程序的内部工作原理以及优化代码性能至关重要。本文将深…

解决宝塔Spring Boot项目获取不到环境变量的问题

问题描述 在使用宝塔面板管理Spring Boot项目时&#xff0c;可能会遇到代码无法获取 /etc/profile 文件中设置的Linux环境变量的问题。虽然在SSH终端中可以正常获取&#xff0c;但在通过宝塔面板启动的Spring Boot项目中&#xff0c;环境变量却无法被读取。 解决方案&#xf…

量化交易研究报告#13

核心公式 通过对 HS300 相对强弱指标值变化规律的梳理&#xff0c;我们制定如下的交易法则&#xff1a; &#xff08;1&#xff09;计算指标的 20 日均值变化&#xff0c;以及 20 日标准差&#xff1b; &#xff08;2&#xff09;20日均值1倍标准差作为上阈值&#xff0c;20…

【Chapter 3: Creating Minimal API Applications】

Chapter 1: Foundations of Framework Learning and Practical Strategies Chapter 2: An Introduction to ASP.NET Core in Layman‘s Terms Chapter 3: Creating Minimal API Applications 1. Overview of Minimal APIs In the vast landscape of ASP.NET Core, “Minima…

Mysql表的三范式、事务和查询

数据表的三范式 在制定数据表,需要遵循的制表规范:第一范式(1NF),第二范式(2NF),第三范式(3NF) 第一范式 属性不可分割,每一个属性(每一个单元格)都是不可再分的原子,也就是说数据表中的每一个字段必须是单独一列的,不能出现还可以再拆分的情况,也可以说成是…

数电基础 - 半导体存储

目录 一. 简介 一. 只读存储器 二. 可编程只读存储器 三. 可擦除的可编程只读存储器 四. 随机存储器 五. 存储器容量的扩展 六. 总结 一. 简介 半导体存储是数字电路中用于存储数据的重要组成部分。 半导体存储器主要分为两大类&#xff1a;随机存取存储器&#xff0…

【人工智能】Transformers之Pipeline(二):自动语音识别(automatic-speech-recognition)

​​​​​​​ 目录 一、引言 二、自动语音识别&#xff08;automatic-speech-recognition&#xff09; 2.1 概述 2.2 技术原理 2.2.1 whisper模型 2.2.2 Wav2vec 2.0模型 2.3 pipeline参数 2.3.1 pipeline对象实例化参数​​​​​​​ 2.3.2 pipeline对象使用参数…

16001.WSL2 ubuntu20.04 编译安装 vsomeip

文章目录 1 vsomeip 编译安装1.1 vsomeip的安装1.2 编译提示错误1.3 编译hello_world示例1.4 运行服务器端 1 vsomeip 编译安装 1.1 vsomeip的安装 参考博文 https://blog.csdn.net/peterwanye/article/details/128386539 1.2 编译提示错误 ubuntu1-BJ-EE1000042:~/opt/vso…

Flask启动5000端口后关不掉了?

事情是这样的&#xff1a; 使用python app.py启动flask应用后&#xff0c;又启动了另一个flask测试应用&#xff0c;也能启动成功&#xff0c;也没有报设么端口冲突&#xff0c;关闭黑窗口后&#xff0c;访问还是有守护进程在运行&#xff0c; 为什么我知道5000还在运行&#…

深入理解缓冲区:提升程序性能的关键

深入理解缓冲区&#xff1a;提升程序性能的关键 1、什么是缓冲区&#xff1f;2、缓冲区的作用3、缓冲区在Java中的应用4、如何操作缓冲区5、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 缓冲区&#xff08;Buffer&#xff09;是一种…