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.pswp.cn/diannao/79891.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79891.shtml
英文地址,請注明出處:http://en.pswp.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;…