c++_csp-j算法 (3)

弗洛伊德算法(Floyd

Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。

介绍

弗洛伊德算法(Floyd算法)是一种用于解决图中任意两点之间的最短路径的算法。它是一种动态规划算法,由罗伯特·弗洛伊德(Robert Floyd)于1962年提出。弗洛伊德算法的基本思想是通过中间节点的递归遍历,逐步更新图中任意两点之间的最短路径。弗洛伊德算法的时间复杂度为O(n^3),适用于解决稠密图中任意两点之间的最短路径问题。

弗洛伊德算法的应用领域非常广泛,包括网络路由算法、图像处理、自动化规划等。在网络路由算法中,弗洛伊德算法常用于计算路由表,以确定网络中任意两点之间的最短路径。在图像处理中,弗洛伊德算法常用于图像分割、图像匹配等领域。在自动化规划中,弗洛伊德算法常用于路径规划、机器人导航等应用。

弗洛伊德算法的核心思想是动态规划。在计算任意两点之间的最短路径时,弗洛伊德算法通过递归遍历中间节点,逐步更新最短路径。具体步骤如下:

  1. 初始化:将图中任意两点之间的距离初始化为无穷大,将图中任意两点之间的直接距离初始化为它们之间的距离。将中间节点初始化为无穷大。

  2. 递归更新:遍历图中的所有节点,以每个节点为中间节点,更新任意两点之间的最短路径。具体步骤如下:

    • 对于每一对节点i、j,以节点k为中间节点,更新节点i、j之间的距离:如果节点i、j之间的距离大于节点i、k之间的距离加上节点k、j之间的距离,则更新节点i、j之间的距离为节点i、k之间的距离加上节点k、j之间的距离。
  3. 重复递归:重复步骤2,直到所有节点为中间节点的最短路径都被更新。

  4. 输出最短路径:最终得到任意两点之间的最短路径。

弗洛伊德算法的时间复杂度为O(n^3),空间复杂度为O(n^2),其中n为图中节点的个数。弗洛伊德算法的优点是能够解决任意两点之间的最短路径问题,适用于解决稠密图中的最短路径问题。弗洛伊德算法的缺点是时间复杂度较高,对于大规模图的计算较为耗时。

总之,弗洛伊德算法是一种用于解决图中任意两点之间的最短路径的动态规划算法。它的核心思想是通过递归遍历中间节点,逐步更新最短路径。弗洛伊德算法在网络路由算法、图像处理、自动化规划等领域有广泛的应用。弗洛伊德算法的时间复杂度为O(n^3),适用于解决稠密图中的最短路径问题。弗洛伊德算法是图算法中的重要算法之一,对于解决图中的最短路径问题具有重要的意义。

### 1. 弗洛伊德算法的基本思想

弗洛伊德算法的基本思想是动态规划。在计算任意两点之间的最短路径时,算法通过递归遍历中间节点,逐步更新最短路径。算法的核心在于利用中间节点的递归思想,通过动态规划的方式逐步优化路径长度,最终得到图中所有节点之间的最短路径。

### 2. 弗洛伊德算法的核心步骤

弗洛伊德算法的核心步骤包括初始化和递归更新两个阶段:

#### 2.1 初始化阶段

1. 将图中任意两点之间的距离初始化为无穷大,将图中任意两点之间的直接距离初始化为它们之间的距离。
2. 将中间节点的距离初始化为无穷大。

#### 2.2 递归更新阶段

1. 遍历图中的所有节点,以每个节点为中间节点,更新任意两点之间的最短路径。
2. 对于每一对节点i、j,以节点k为中间节点,更新节点i、j之间的距离:如果节点i、j之间的距离大于节点i、k之间的距离加上节点k、j之间的距离,则更新节点i、j之间的距离为节点i、k之间的距离加上节点k、j之间的距离。

#### 2.3 重复递归阶段

重复递归更新阶段,直到所有节点为中间节点的最短路径都被更新。

#### 2.4 输出最短路径

最终得到图中所有节点之间的最短路径。

### 3. 弗洛伊德算法的时间复杂度

弗洛伊德算法的时间复杂度为O(n^3),其中n为图中节点的个数。算法中的三重循环是导致时间复杂度较高的原因,因此在大规模图的计算中,算法可能会耗费较长时间。

### 4. 弗洛伊德算法的优点和缺点

#### 4.1 优点:

- 能够解决任意两点之间的最短路径问题,适用于解决稠密图中的最短路径问题。
- 算法思想简单,易于理解和实现。

#### 4.2 缺点:

- 时间复杂度较高,对于大规模图的计算可能会耗费较长时间。
- 空间复杂度较高,需要维护大量的中间节点距离信息。

### 5. 弗洛伊德算法的应用

弗洛伊德算法在网络路由算法、图像处理、自动化规划等领域有广泛的应用。在网络路由算法中,弗洛伊德算法常用于计算路由表,以确定网络中任意两点之间的最短路径。在图像处理中,弗洛伊德算法常用于图像分割、图像匹配等领域。在自动化规划中,弗洛伊德算法常用于路径规划、机器人导航等应用。

### 6. 总结

弗洛伊德算法是一种经典的动态规划算法,用于解决图中任意两点之间的最短路径问题。算法通过递归遍历中间节点,逐步更新最短路径,最终得到图中所有节点之间的最短路径。弗洛伊德算法的时间复杂度为O(n^3),适用于解决稠密图中的最短路径问题。算法在网络路由算法、图像处理、自动化规划等领域有广泛的应用,是图算法中的重要算法之一。弗洛伊德算法的优点是能够解决任意两点之间的最短路径问题,易于理解和实现,但缺点是时间复杂度较高,对于大规模图的计算可能会耗费较长时间。

算法实现

弗洛伊德算法(Floyd算法)是一种经典的动态规划算法,用于解决图中任意两点之间的最短路径问题。该算法的实现涉及到图的表示、距离矩阵的初始化、动态规划的递归更新等步骤。在本节中,我们将详细介绍弗洛伊德算法的实现过程,包括算法的伪代码、代码实现、时间复杂度分析等内容。

### 1. 弗洛伊德算法的伪代码

下面是弗洛伊德算法的伪代码实现:

```
procedure FloydWarshall (graph)
    let dist be a |V| × |V| array of minimum distances initialized to ∞ (infinity)
    let next be a |V| × |V| array of vertex indices initialized to NULL

    for each edge (u, v) in graph
        dist[u][v] = graph[u][v]
        next[u][v] = v

    for each vertex v in graph
        dist[v][v] = 0
        next[v][v] = v

    for k from 1 to |V|
        for i from 1 to |V|
            for j from 1 to |V|
                if dist[i][j] > dist[i][k] + dist[k][j]
                    dist[i][j] = dist[i][k] + dist[k][j]
                    next[i][j] = next[i][k]
```

### 2. 弗洛伊德算法的代码实现(Python示例)

下面是弗洛伊德算法的Python代码实现示例:

```python
def floyd_warshall(graph):
    dist = [[float('inf') for _ in range(len(graph))] for _ in range(len(graph))]
    next = [[None for _ in range(len(graph))] for _ in range(len(graph))]

    for u in range(len(graph)):
        for v in range(len(graph)):
            dist[u][v] = graph[u][v]
            next[u][v] = v

    for v in range(len(graph)):
        dist[v][v] = 0
        next[v][v] = v

    for k in range(len(graph)):
        for i in range(len(graph)):
            for j in range(len(graph)):
                if dist[i][j] > dist[i][k] + dist[k][j]:
                    dist[i][j] = dist[i][k] + dist[k][j]
                    next[i][j] = next[i][k]

    return dist, next
```

### 3. 弗洛伊德算法的时间复杂度分析

弗洛伊德算法的时间复杂度为O(n^3),其中n为图中节点的个数。算法中的三重循环是导致时间复杂度较高的原因。在实际应用中,算法的时间复杂度可能在处理大规模图的情况下导致较长的计算时间。

### 4. 弗洛伊德算法的应用示例

下面是一个简单的示例,展示如何使用弗洛伊德算法计算图中任意两点之间的最短路径:

```python
graph = [
    [0, 3, 8, float('inf')],
    [float('inf'), 0, 2, 4],
    [float('inf'), float('inf'), 0, 1],
    [float('inf'), float('inf'), float('inf'), 0]
]

distances, next_vertices = floyd_warshall(graph)

print("Shortest distances between each pair of vertices:")
for i in range(len(graph)):
    for j in range(len(graph)):
        if distances[i][j] == float('inf'):
            print(f"Distance from vertex {i} to vertex {j} is infinity")
        else:
            print(f"Distance from vertex {i} to vertex {j} is {distances[i][j]}")
```

### 5. 总结

弗洛伊德算法是一种经典的动态规划算法,用于解决图中任意两点之间的最短路径问题。算法的实现涉及到图的表示、距离矩阵的初始化、动态规划的递归更新等步骤。通过递归更新中间节点,算法能够高效地计算图中任意两点之间的最短路径。弗洛伊德算法在网络路由算法、图像处理、自动化规划等领域有广泛的应用,是图算法中的重要算法之一。

整体代码

#include <iostream>
#include <vector>
#include <climits>using namespace std;const int INF = 1e9; // 定义无穷大int main() {int n, m;cin >> n >> m;// 初始化距离矩阵vector<vector<int>> dist(n + 1, vector<int>(n + 1, INF));// 自身到自身的距离为0for (int i = 1; i <= n; ++i) {dist[i][i] = 0;}// 读取边并处理重边for (int i = 0; i < m; ++i) {int u, v, w;cin >> u >> v >> w;if (w < dist[u][v]) {dist[u][v] = w;dist[v][u] = w;}}// Floyd-Warshall算法for (int k = 1; k <= n; ++k) {for (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) {if (dist[i][k] != INF && dist[k][j] != INF) {dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);}}}}// 输出结果for (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) {if (dist[i][j] == INF) {cout << "0 "; // 根据题目描述,边权都是正整数,所以不可达的情况可能不存在,但按题意输出0} else {cout << dist[i][j] << " ";}}cout << endl;}return 0;
}

例题

B3647 【模板】Floyd

B3647 【模板】Floyd - 洛谷

# B3647 【模板】Floyd

## 题目描述

给出一张由 $n$ 个点 $m$ 条边组成的无向图。

求出所有点对 $(i,j)$ 之间的最短路径。

## 输入格式

第一行为两个整数 $n,m$,分别代表点的个数和边的条数。

接下来 $m$ 行,每行三个整数 $u,v,w$,代表 $u,v$ 之间存在一条边权为 $w$ 的边。

## 输出格式

输出 $n$ 行每行 $n$ 个整数。

第 $i$ 行的第 $j$ 个整数代表从 $i$ 到 $j$ 的最短路径。

## 输入输出样例 #1

### 输入 #1

```
4 4
1 2 1
2 3 1
3 4 1
4 1 1
```

### 输出 #1

```
0 1 2 1
1 0 1 2
2 1 0 1
1 2 1 0
```

## 说明/提示

对于 $100\%$ 的数据,$n \le 100$,$m \le 4500$,任意一条边的权值 $w$ 是正整数且 $1 \leqslant w \leqslant 1000$。

**数据中可能存在重边。**

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

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

相关文章

QT常见输入类控件及其属性

Line Edit QLineEdit用来表示单行输入框&#xff0c;可以输入一段文本&#xff0c;但是不能换行 核心属性&#xff1a; 核心信号 信号 说明 void cursorPositionChanged(int old,int new) 当鼠标移动时发出此型号&#xff0c;old为先前位置&#xff0c;new为新位置 void …

【k8s系列1】一主两从结构的环境准备

环境准备 虚拟机软件准备及安装&#xff0c;这里就不详细展开了&#xff0c;可以看文章:【一、虚拟机vmware安装】 linux环境准备及下载&#xff0c;下载镜像centOS7.9&#xff0c;以前也有写过这个步骤的文章&#xff0c;可以看&#xff1a;【二、安装centOS】 开始进入正题…

【C++类和数据抽象】类的作用域

目录 一、类的作用域基本概念 1.1 什么是类的作用域 1.2 作用域层次体系 1.3 类作用域的特点 1.4 基本访问规则 二、访问控制三剑客 2.1 public&#xff1a;开放接口 2.2 private&#xff1a;数据封装 2.3 protected&#xff1a;继承通道 2.4 跨作用域访问示例 三…

opencv图片颜色识别,颜色的替换

图片颜色识别 1. RGB颜色空间2. 颜色加法2.1使用numpy对图像进行加法2.2使用opencv加法&#xff08;cv2.add&#xff09; 3 颜色加权加法&#xff08;cv2.addWeighted()&#xff09;4. HSV颜色空间5. 制作掩膜4. 与运算&#xff08;cv2.bitwise_and&#xff09;5.颜色的替换7 R…

ADC数据不稳定的解决方案

问题如图&#xff1a; 解决方案&#xff1a;上图第一个通道后来接入GND&#xff0c;就稳定了 上图第一个通道后来接入VCC&#xff0c;就稳定了

Spark(18)Yarn-概述

Hadoop三大核心组件&#xff1a;HDFS、MapReduce和YARN 一&#xff09;Yarn的概念 YARN(Yet Another Resource Negotiator,另一种资源协调者)是一个通用资源管理系统和调度平台&#xff0c;可为上层应用提供统一的资源管理和调度。它的引入为集群在利用率&#xff0c;资源统一管…

Flowith AI,解锁下一代「知识交易市场」

前言 最近几周自媒体号都在疯狂推Manus&#xff0c;看了几篇测评后&#xff0c;突然在某个时间节点&#xff0c;在特工的文章下&#xff0c;发现了很小众的Flowith。 被这段评论给心动到&#xff0c;于是先去注册了下账号。一翻探索过后&#xff0c;发现比我想象中要有趣的多&…

Maxscript调用Newtonsoft.Json解析Json

Maxscript调用Newtonsoft.Json解析Json_newtonsoft.json maxscript-CSDN博客

搭建用友U9Cloud ERP及UAP IDE环境

应用环境 Microsoft Windows 10.0.19045.5487 x64 专业工作站版 22H2Internet Information Services - 10.0.19041.4522Microsoft SQL Server 2019 - 15.0.2130.3 (X64)Microsoft SQL Server Reporing Services 2019 - 15.0.9218.715SQL Server Management Studio -18.6 laster…

github新建一个远程仓库并添加了README.md,本地git仓库无法push

1.本地git仓库与远程仓库绑定 2.push时报错&#xff0c;本地的 main 分支落后于远程仓库的 main 分支&#xff08;即远程有更新&#xff0c;但你本地没有&#xff09;&#xff0c;需要拉取远程的仓库--->在merge合并&#xff08;解决冲突&#xff09;--->push 3.但是git …

我用deepseek做了一个提取压缩文件夹下pdf和word文件工具

由于最近需要把大量的压缩文件的pdf和word文件统一复制到一个文件夹中。 我们一般正常操作方式的是把一个压缩文件一个一个解压&#xff0c;然后在把一个的解压好的文件夹下文件复制到另外一个文件夹中。 这个也需太繁琐了&#xff0c;从以往统计的需要花费两个小时间&#x…

企业网络安全合规风险高、运营不稳定,要怎么解决?

在数字化浪潮中&#xff0c;数据已然成为企业的核心资产&#xff0c;其重要性不言而喻。然而&#xff0c;数据泄露风险也时刻威胁着企业的生存与发展。不少企业在历经数据泄露的惨痛教训后&#xff0c;纷纷选择部署数据防泄露系统。那么&#xff0c;企业部署数据防泄露系统前后…

C#—Lazy<T> 类型(延迟初始化/懒加载模式)

C# 的 Lazy<T> 类型 Lazy<T> 是 C# 中的一个类&#xff0c;用于实现延迟初始化&#xff08;懒加载&#xff09;模式。它提供了一种线程安全的方式来延迟创建大型或资源密集型对象&#xff0c;直到第一次实际需要时才进行初始化。 主要特点 延迟初始化&#xff1a…

C++之unordered封装

目录 一、哈希表的修改 1.1、哈希表节点结构 1.2、迭代器 1.3、哈希表结构 1.4、完整代码 二、unordered_map的实现 二、unordered_set的实现 一、哈希表的修改 注意&#xff1a;这里我们使用哈希桶来封装unordered_map和unordered_set。 1.1、哈希表节点结构 templa…

[渗透测试]渗透测试靶场docker搭建 — —全集

[渗透测试]渗透测试靶场docker搭建 — —全集 对于初学者来说&#xff0c;仅仅了解漏洞原理是不够的&#xff0c;还需要进行实操。对于公网上的服务我们肯定不能轻易验证某些漏洞&#xff0c;否则可能触犯法律。这是就需要用到靶场。 本文主要给大家介绍几种常见漏洞对应的靶场…

Docker如何更换镜像源提高拉取速度

在国内&#xff0c;由于网络政策和限制&#xff0c;直接访问DockerHub速度很慢&#xff0c;尤其是在拉取大型镜像时。为了解决这个问题&#xff0c;常用的方法就是更换镜像源。本文将详细介绍如何更换Docker镜像源&#xff0c;并提供当前可用的镜像源。 换源方法 方法1&#x…

第一篇:从哲学到管理——实践论与矛盾论如何重塑企业思维

引言&#xff1a;当革命哲学照亮现代商业 1937年&#xff0c;毛泽东在战火中写就的《实践论》《矛盾论》&#xff0c;为中国共产党提供了认识世界的方法论。今天&#xff0c;这两部著作正成为企业破解管理困局的“思维操作系统”&#xff1a; 战略模糊&#xff1a;据Gartner统…

云原生--基础篇-2--云计算概述(云计算是云原生的基础,IaaS、PaaS和SaaS服务模型)

1、云计算概念 云计算是一种通过互联网提供计算资源&#xff08;包括服务器、存储、数据库、网络、软件等&#xff09;和服务的技术模式。用户无需拥有和维护物理硬件&#xff0c;而是可以根据需要租用这些资源&#xff0c;并按使用量付费。 2、云计算特点 &#xff08;1&am…

一级滤波器设计:IL_cmdm > 80dB

目录 背景 目的 操作 仿真测试 搭建仿真模型 插入损耗测试 优化设计后重新测试 思考 背景 在选购共模电感时&#xff0c;规格书中通常会提供插损曲线或者阻抗-频率曲线&#xff0c;但这些数据都是在特定条件下测试获得的。如果将其集中在我们的样机中性能会如何&#…

qt 配置 mysql 驱动问题:Cannot load library qsqlmysql;QMYSQL driver not loaded

项目场景&#xff1a; 环境版本&#xff1a; qt &#xff1a;5.14.2 mysql&#xff1a;8.0 windows&#xff1a;10 提示&#xff1a;qt 配置 mysql 驱动&#xff1a; 项目场景&#xff1a;qt 配置 mysql 驱动 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a;…