二十七、搜索与图论——Floyd 算法(多元路最短路径问题)

Floyd算法主要内容

  • 一、基本思路
    • 1、算法原理
    • 2、基本思路
    • 3、注意
  • 二、Java、C语言模板实现
  • 三、例题题解

一、基本思路

1、算法原理

  • 遍历每条边,通过比较进行路径更新——暴力

  • 解决多源最短路问题,求解 i 点到 j 点的最短距离

    • f [ i, j, k] 表示从 i 走到 j 的路径上除 i 和 j 点外只经过1到k的点的所有路径的最短距离。
    • 那么 f [i, j, k] = min( f [i, j, k - 1), f [i, k, k - 1] + f [k, j, k - 1]。
    • 因此在计算第 k 层的 f [i, j] 的时候必须先将第 k - 1层的所有状态计算出来,所以需要把 k 放在最外层。
  • 使用邻接矩阵 d[i][j] 进行存储

2、基本思路

 for(int kk = 1; kk <= n; kk++){
   for(int i = 1; i <= n; i++){
     for(int j = 1; j <= n; j++){
        d[i][j] = Math.min(d[i][j], d[i][kk] + d[kk][j]);      
        }
    }
}
  • i -----> k -----> j
  • 用k来更新 i —> j 的距离

3、注意

    1. 在进行 Floyd 算法之前需要进行邻接矩阵的初始化——考虑重边和自环
for(int i = 1; i <= n; i++){        // 邻接矩阵解决自环问题
   for(int j = 1; j <= n; j++){
      if(i == j){
         d[i][j] = 0;            // 解决自环问题,让自环不对结果产生影响,自环没必要用
         }else{
         d[i][j] = INF;
   		}
   }
}
    1. 结束后,d[i][j] 存的是 i —> 的最短路径

二、Java、C语言模板实现

//Java 模板实现
 for(int kk = 1; kk <= n; kk++){
   for(int i = 1; i <= n; i++){
     for(int j = 1; j <= n; j++){
        d[i][j] = Math.min(d[i][j], d[i][kk] + d[kk][j]);      
        }
    }
}
```cpp
// yxc
初始化:
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= n; j ++ )
            if (i == j) d[i][j] = 0;
            else d[i][j] = INF;

// 算法结束后,d[a][b]表示a到b的最短距离
void floyd()
{
    for (int k = 1; k <= n; k ++ )
        for (int i = 1; i <= n; i ++ )
            for (int j = 1; j <= n; j ++ )
                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}

三、例题题解

在这里插入图片描述

// java题解实现
import java.util.*;

public class Main{
    static int N = 210;
    static int INF = 0x3f3f3f3f;
    static int[][] d = new int[N][N];       // 使用邻接矩阵进行边的存储,表示从i点到k点的距离值
    static int x,y,z;
    static int n,m,k;
    
    static void Floyd(){
        
        for(int kk = 1; kk <= n; kk++){
            for(int i = 1; i <= n; i++){
                for(int j = 1; j <= n; j++){
                    d[i][j] = Math.min(d[i][j], d[i][kk] + d[kk][j]);       // 将节点 k 作为中间点,进行距离更新
                }
            }
        }
    }
    
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        
        n = in.nextInt();
        m = in.nextInt();
        k = in.nextInt();
        
        for(int i = 1; i <= n; i++){        // 邻接矩阵解决自环问题
            for(int j = 1; j <= n; j++){
                if(i == j){
                    d[i][j] = 0;            // 解决自环问题,让自环不对结果产生影响,自环没必要用
                }else{
                    d[i][j] = INF;
                }
            }
        }
        
        
        for(int i = 0; i < m; i++){
            x = in.nextInt();
            y = in.nextInt();
            z = in.nextInt();
            
            d[x][y] = Math.min(d[x][y], z);
        }
        
        
        Floyd();
        
        for(int i = 0; i < k; i++){
            x = in.nextInt();
            y = in.nextInt();
            
            if(d[x][y] > INF/2){
                System.out.println("impossible");
            }else{
                System.out.println(d[x][y]);
            }
            
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux | 将SpringBoot+Vue项目部署到服务器上

知识目录 一、写在前面二、后端部署2.1 项目打包2.2 项目运行 三、通过Shell脚本自动部署项目3.1 安装Git和Maven3.2 编写Shell脚本3.2 执行脚本 四、前端部署4.1 安装NGINX4.2 node.js安装4.3 npm打包项目4.4 运行项目 四、总结撒花 一、写在前面 大家好&#xff0c;我是初心…

AlmaLinux 9.2 正式版发布 - RHEL 兼容免费发行版

AlmaLinux 9.2 正式版发布 - RHEL 兼容免费发行版 由社区提供的免费 Linux 操作系统&#xff0c;RHEL 兼容发行版。 请访问原文链接&#xff1a;https://sysin.org/blog/almalinux-9/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sys…

K8s(Kubernetes)学习(一):k8s概念及组件

Kubernetes中文文档&#xff1a;https://kubernetes.io/zh-cn/docs/home/ Kubernetes源码地址&#xff1a;https://github.com/kubernetes/kubernetes 一:Kubernetes是什么 首先要了解应用程序部署经历了以下几个时代&#xff1a; 传统部署时代&#xff1a;在物理服务器上运…

ChatGPT学习研究总结

目录 ChatGPT研究总结 一、程序接入用途不大 二、思考&#xff1a;如何构建一个类似ChatGPT的自定义模型 一些ChatGPT研究学习资料&#xff08;来源网络&#xff09; &#xff08;1&#xff09;一文读懂ChatGPT模型原理 &#xff08;2&#xff09;MATLAB科研图像处理——…

DHCP+链路聚合+NAT+ACL小型实验

实验要求: 1.按照拓扑图上标识规划网络。 2.使用0SPF协议进程100实现ISP互通。 3.私网内PC属于VLAN1O, FTP Server属于VLAN2O,网关分 别为所连接的接入交换机&#xff0c;其中PC要求通过DHCP动态获取 4:私网内部所有交换机都为三层交换机&#xff0c;请合理规划VLAN&#…

带你深入学习k8s--(四) 控制器(k8s核心)

目录 一、概念 1、什么是控制器 2、控制器执行流程 3、控制器类型 二、控制器的使用 1、ReplicaSet 2、Deployment 1、版本迭代 2、回滚 3、修改滚动更新策略 4、暂停与恢复 3、daemonset 4、job 5、cronjob 前言&#xff1a; 上一章我们说到&#xff0c;pod有…

VScode添加右键运行、并设置每次运行前都清屏即去除之前的输出

一、添加右键运行 下载安装运行插件即可 二、运行前清屏 在运行插件中设置 找到Code-runner: Clear Previous Output&#xff0c;把√打上即可

【Linux Network】传输层协议——TCP

目录 TCP协议 TCP协议段格式 确认应答(ACK)机制 超时重传机制 连接管理机制 理解TIME_WAIT状态 解决TIME_WAIT状态引起的bind失败的方法 理解 CLOSE_WAIT 状态 滑动窗口 流量控制 拥塞控制 延迟应答 捎带应答 面向字节流 粘包问题 TCP异常情况 TCP小结 基于TCP应用层协议 TCP/U…

Pytroch nn.Unfold() 与 nn.Fold()图码详解

文章目录 Unfold()与Fold()的用途nn.Unfold()Unfold()与Fold() 变化模式图解 nn.Fold()单通道 滑动窗口无重叠模拟图片数据&#xff08;b,3,9,9&#xff09;&#xff0c;通道数 C 为3&#xff0c;滑动窗口无重叠。单通道 滑动窗口有重叠。 卷积等价于&#xff1a;Unfold Matri…

【滤波专题-第7篇】“类EMD”算法分解后要怎样使用(3)——EMD降噪方法及MATLAB代码实现

使用EMD分解&#xff08;以及其他“类EMD”分解方法&#xff0c;以下为了简便统称EMD&#xff09;做信号降噪&#xff0c;是EMD的一个比较重要的应用方向。EMD可以将复杂的信号分解为一系列的固有模态函数&#xff08;IMFs&#xff09;&#xff0c;每一个IMF都包含了信号的一部…

ChatGPT:2. 使用OpenAI创建自己的AI网站:1. 初探API

使用OpenAI创建自己的AI网站 如果你还是一个OpenAI的小白&#xff0c;有OpenAI的账号&#xff0c;但想调用OpenAI的API搞一些有意思的事&#xff0c;那么这一系列的教程将仔细的为你讲解如何使用OpenAI的API制作属于自己的AI网站。博主只能利用下班时间更新&#xff0c;进度慢…

【利用AI刷面试题】AI:十道不常见的TypeScript面试题

文章目录 前言&#x1f60f;以下是关于 TypeScript 的一些偏僻的面试题&#x1f61d;1. 泛型约束中的 "extends" 关键字有哪些用法和含义&#xff1f;2. 什么是交叉类型&#xff08;Intersection Types&#xff09;&#xff1f;如何在 TypeScript 中定义和使用它们&a…

第N2周:中文文本分类-Pytorch实现

目录 一、前言二、准备工作三、数据预处理1.加载数据2.构建词典3.生成数据批次和迭代器 三、模型构建1. 搭建模型2. 初始化模型3. 定义训练与评估函数 四、训练模型1. 拆分数据集并运行模型 一、前言 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 …

不愧是腾讯 ,问的贼细

腾讯软件测试岗位的面试流程可能会因个人经验和公司而异&#xff0c;但通常情况下&#xff0c;腾讯软件测试的面试分为初试、二面、三面和四面。以下是每一轮面试可能涉及到的问题&#xff1a; 初试&#xff1a; 请介绍一下自己&#xff0c;以及为什么想要加入腾讯软件测试团…

时序预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络时间序列预测

时序预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络时间序列预测 目录 时序预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-CNN-LSTM贝叶斯优…

操作系统实验二 进程(线程)同步

前言 实验二相比实验一难度有所提升&#xff0c;首先得先掌握好相应的理论知识&#xff08;读者-写者问题和消费者-生产者问题&#xff09;&#xff0c;才能在实验中得心应手。任务二的代码编写可以借鉴源码&#xff0c;所以我们要先读懂源码。 1.实验目的 掌握Linux环境下&a…

浅谈Redis

一、Redis的简介 1.开源免费的缓存中间件,性能高,读可达110000次/s,写可达81000次/s。 2.redis的单线程讨论&#xff1a; V4.0之前&#xff1a;是单线程的&#xff0c;所有任务处理都在一个线程内完成. V4.0&#xff1a;引入多线程&#xff0c;异步线程用于处理一些耗…

Linux三种网络模式 | 仅主机、桥接、NAT

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Linux三种网络模式 仅主机模式&#xff1a;虚拟机只能访问物理机&#xff0c;不能上网 桥接模式&#xff1a;虚拟机和物理机连接同一网络&#xff0c;虚拟机和物理机…

Docker的四种网络模式

1.Host 模式 通常来讲&#xff0c;启动新的Docker容器&#xff0c;都会分配独立的Network Namespace隔离子系统&#xff0c;如果在运行是指定为host模式&#xff0c;那么Docker容器将不会获得一个独立的Network Namespace&#xff0c;而是和宿主机共用一个Network Namespace子…

山东专升本计算机第六章-数据库技术

数据库技术 SQL数据库与NOSQL数据库的区别 数据库管理系统 考点 6 数据库管理系统的组成和功能 组成 • 模式翻译 • 应用程序的翻译 • 交互式查询 • 数据的组织和存取 • 事务运行管理 • 数据库的维护 功能 • 数据定义功能 • 数据存取功能 • 数据库运行管理…