深入解析BFS算法:C++實現無權圖最短路徑的高效解決方案

????????在無權圖中,廣度優先搜索(BFS)是解決最短路徑問題的高效算法。接下來博主從專業角度深入探討其實現細節,并給出C++代碼示例:


目錄

一、核心原理

二、算法步驟

三、C++實現關鍵點

1. 數據結構

2. 邊界檢查

3. 路徑回溯(可選)

四、代碼實現

五、路徑回溯實現

六、復雜度分析

七、適用場景與限制


一、核心原理

BFS按層遍歷節點,確保首次到達目標節點的路徑是最短的。其核心特性為:

  • 隊列管理:先進先出(FIFO)保證按層擴展。

  • 訪問標記:避免重復訪問,防止環路。

  • 距離記錄:每個節點的距離為父節點距離加1。


二、算法步驟

  1. 初始化:起點入隊,標記距離為0。

  2. 遍歷隊列:逐層處理節點,遍歷所有合法鄰居。

  3. 終止條件:到達終點時返回距離;隊列為空則表示不可達。


三、C++實現關鍵點

1. 數據結構

  • 隊列:存儲待處理節點,使用queue<pair<int, int>>

  • 距離矩陣:記錄每個節點的最短距離,初始化為-1表示未訪問。

  • 方向數組:定義移動方向(如4方向或8方向)。

int dx[] = {-1, 1, 0, 0};  // 上下左右
int dy[] = {0, 0, -1, 1};

2. 邊界檢查

確保新坐標在網格范圍內,且節點可訪問(非障礙、未訪問)。

3. 路徑回溯(可選)

通過父節點矩陣記錄路徑,回溯時從終點反向追蹤至起點。


四、代碼實現

#include <iostream>
#include <vector>
#include <queue>
using namespace std;int bfsShortestPath(vector<vector<int>>& grid, pair<int, int> start, pair<int, int> end) {int n = grid.size();if (n == 0) return -1;int m = grid[0].size();queue<pair<int, int>> q;vector<vector<int>> dist(n, vector<int>(m, -1));int dx[] = {-1, 1, 0, 0};int dy[] = {0, 0, -1, 1};// 初始化起點q.push(start);dist[start.first][start.second] = 0;while (!q.empty()) {auto curr = q.front();q.pop();// 到達終點if (curr.first == end.first && curr.second == end.second) {return dist[curr.first][curr.second];}// 遍歷四個方向for (int i = 0; i < 4; ++i) {int x = curr.first + dx[i];int y = curr.second + dy[i];// 檢查新坐標是否合法if (x >= 0 && x < n && y >= 0 && y < m && grid[x][y] == 0 && dist[x][y] == -1) {dist[x][y] = dist[curr.first][curr.second] + 1;q.push({x, y});}}}return -1;  // 不可達
}// 示例用法
int main() {vector<vector<int>> grid = {{0, 1, 0, 0},{0, 0, 0, 1},{1, 1, 0, 0},{0, 0, 0, 0}};pair<int, int> start = {0, 0};pair<int, int> end = {3, 3};int shortest = bfsShortestPath(grid, start, end);if (shortest != -1) {cout << "最短路徑長度: " << shortest << endl;} else {cout << "無法到達終點!" << endl;}return 0;
}

五、路徑回溯實現

擴展代碼以記錄路徑:

vector<pair<int, int>> getPath(vector<vector<pair<int, int>>>& parent, pair<int, int> start, pair<int, int> end) {vector<pair<int, int>> path;pair<int, int> curr = end;while (curr != start) {path.push_back(curr);curr = parent[curr.first][curr.second];}path.push_back(start);reverse(path.begin(), path.end());return path;
}// 在BFS函數中添加父節點記錄
vector<vector<pair<int, int>>> parent(n, vector<pair<int, int>>(m, {-1, -1}));
// ...
if (條件滿足) {parent[x][y] = curr;
}
// 找到終點后調用getPath

六、復雜度分析

  • 時間復雜度:O(N×M),每個節點處理一次。

  • 空間復雜度:O(N×M),隊列和距離矩陣的開銷。


七、適用場景與限制

  • 適用:無權圖、網格迷宮、社交網絡層級關系。

  • 限制:僅處理無權圖,帶權圖需改用Dijkstra或A*算法。

????????通過以上實現,BFS能夠高效解決無權圖中的最短路徑問題。正確管理隊列和狀態標記是保證算法正確性的關鍵。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70499.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70499.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70499.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Plant Simulation培訓教程-雙深堆垛機立庫仿真模塊

原創 知行 天理智能科技 2025年01月03日 17:02 浙江 又到年終盤點的時候了&#xff0c;在這里我把之前錄制的Plant Simulation培訓教程-雙深堆垛機立庫仿真模塊分享出來&#xff0c;有需要的可以直接聯系我。 雙深堆垛機立庫仿真模塊基于單深模塊開發&#xff0c;適用于雙深堆…

文本和語音互轉

目錄 1. 下載依賴ddl 2. 引入Pom依賴 3. java代碼 二. 語音轉文本 1. 下載中文語音轉文本的模型 2. 引入pom依賴 3. java代碼 4. 運行效果 1. 下載依賴ddl 文字轉語音文件需要使用jacob的dll文件放在jdk安裝目錄下的bin文件夾下 點擊官網下載錄或者通過csdn下載 2. …

DeepSeek破局啟示錄:一場算法優化對算力霸權的降維打擊

導言 2024年,中國AI大模型賽道殺出一匹黑馬——深度求索(DeepSeek)。從數學推理能力超越GPT-4,到API價格僅為Claude 3.5的1/53,再到開源生態的快速擴張,DeepSeek的崛起不僅打破了“算力霸權”的固有認知,更揭示了AI行業底層邏輯的深刻變革。這場技術革命背后,隱藏著技術…

Python大數據可視化:基于python大數據的電腦硬件推薦系統_flask+Hadoop+spider

開發語言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.7.7數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;PyCharm 系統展示 管理員登錄 管理員功能界面 價格區間界面 用戶信息界面 品牌管理 筆記本管理 電腦主機…

阿里云虛機的遠程桌面登錄提示帳戶被鎖定了

提示由于安全原因&#xff0c;帳戶被鎖定。 阿里云虛機ECS的遠程桌面登錄提示帳戶被鎖定了&#xff0c;只能登錄阿里云處理 阿里云-計算&#xff0c;為了無法計算的價值 需選擇通過VNC連接 然后計算機管理&#xff0c;解除帳戶鎖定即可。

Grok 使用指南

文章來源&#xff1a;Grok 漫游指南 | xAI Docs 歡迎&#xff01;在本指南中&#xff0c;我們將引導您了解使用 xAI API 的基礎知識。 #第 1 步&#xff1a;創建 xAI 帳戶 您需要一個 xAI 帳戶才能訪問 xAI API。在此處注冊帳戶。 創建賬戶后&#xff0c;您需要為其加載積分…

Node.js高頻面試題精選及參考答案

目錄 什么是 Node.js?它的主要特點有哪些? Node.js 的事件驅動和非阻塞 I/O 模型是如何工作的? 為什么 Node.js 適合處理高并發場景? Node.js 與傳統后端語言(如 Java、Python)相比,有哪些優勢和劣勢? 簡述 Node.js 的運行原理,包括 V8 引擎的作用。 什么是 Nod…

Servlet概述(Ⅰ)

目錄 一、Servlet概述 演示 創建JavaWeb項目&#xff08;2017版本為例&#xff09; 1. 打開 IntelliJ IDEA 2. 選擇項目類型 3. 配置框架 二、Servlet初識(熟練) 1.servlet說明 2.Servlet 接口方法 3.創建Servlet 4.JavaWeb請求響應流程 ?編輯 ?編輯 5.servlet…

Windows 小記 18 —— 子窗口繼承父窗口的樣式

子窗口會繼承父窗口或者所有者窗口的一些樣式。 當我們使用 CreateWindowExW 創建窗口后&#xff0c;指定其 HwndParent 參數時&#xff0c;或者通過 SetWindowLongPtr(vd->Hwnd, GWLP_HWNDPARENT, (LONG_PTR)vd->HwndParent); 指定所有者窗口時&#xff0c;子窗口將從父…

19、《Springboot+MongoDB整合:玩轉文檔型數據庫》

SpringbootMongoDB整合&#xff1a;玩轉文檔型數據庫 摘要&#xff1a;本文全面講解Spring Boot與MongoDB的整合實踐&#xff0c;涵蓋環境搭建、CRUD操作、聚合查詢、事務管理、性能優化等核心內容。通過15個典型代碼示例&#xff0c;演示如何高效操作文檔數據庫&#xff0c;深…

跳躍游戲II(力扣45)

這道題在跳躍游戲(力扣55)-CSDN博客 的基礎上需要找到最小的跳躍次數。那么我們需要用一個變量來統計跳躍次數&#xff0c;而難點就在于何時讓該變量的值增加。這一點我寫在注釋中&#xff0c;大家結合我的代碼會更好理解。其他部分跟跳躍游戲(力扣55)-CSDN博客 幾乎相同&#…

Linux基礎開發工具的使用(apt、vim、gcc、g++、gdb、make、makefile)

Linux軟件包管理器–apt Linux安裝軟件的方式 在Linux下安裝軟件的方法有以下三種&#xff1a; 下載到程序的源代碼&#xff0c;自己編譯出可執行程序獲取deb安裝包、然后使用dpkg命令安裝。&#xff08;不解決依賴關系&#xff09;通過apt進行安裝軟件。 小知識點&#xf…

C/C++ | 每日一練 (2)

&#x1f4a2;歡迎來到張胤塵的技術站 &#x1f4a5;技術如江河&#xff0c;匯聚眾志成。代碼似星辰&#xff0c;照亮行征程。開源精神長&#xff0c;傳承永不忘。攜手共前行&#xff0c;未來更輝煌&#x1f4a5; 文章目錄 C/C | 每日一練 (2)題目參考答案封裝繼承多態虛函數底…

【前端框架】vue2和vue3的區別詳細介紹

Vue 3 作為 Vue 2 的迭代版本&#xff0c;在性能、語法、架構設計等多個維度均有顯著的變革與優化。以下詳細剖析二者的區別&#xff1a; 響應式系統 Vue 2 實現原理&#xff1a;基于 Object.defineProperty() 方法實現響應式。當一個 Vue 實例創建時&#xff0c;Vue 會遍歷…

基于Spring Boot的農事管理系統設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

【RISCV 常見匯編指令學習 1.2 -- CSRW | CSRR | XORI | ANDI | DRET | J | JR】

文章目錄 Overview1. CSRW 與 CSRR2. SW 與 lw3. XORI 與 ANDI4. J 與 JR5. ret 與 dret6. 總結&#x1f310; Sources Overview 在 RISCV 匯編中&#xff0c;不同類型的指令用于完成控制寄存器操作、內存存取、位操作、跳轉以及返回等功能。下面將逐對詳細介紹這些指令&#…

MySQL六大日志的功能介紹。

前言 首先&#xff0c;MySQL的日志應該包括二進制日志&#xff08;Binary Log&#xff09;、錯誤日志&#xff08;Error Log&#xff09;、查詢日志&#xff08;General Query Log&#xff09;、慢查詢日志&#xff08;Slow Query Log&#xff09;、重做日志&#xff08;Redo …

【AI】GitHub Copilot

GitHub Copilot 是一款由 GitHub 和 OpenAI 合作開發的 AI 編程助手&#xff0c;它可以在多種開發工具中使用。以下是 GitHub Copilot 支持的主要開發工具和平臺&#xff1a; 1. Visual Studio Code (VS Code) 官方支持&#xff1a;GitHub Copilot 在 VS Code 中擁有最完整的集…

拆解微軟CEO納德拉戰略藍圖:AI、量子計算、游戲革命如何改寫未來規則!

2025年2月19日 知名博主Dwarkesh Patel對話微軟CEO薩蒂亞納德拉 在最新訪談釋放重磅信號&#xff1a;AI將掀起工業革命級增長&#xff0c;量子計算突破引爆材料科學革命&#xff0c;游戲引擎進化為世界模擬器。 整個視頻梳理出幾大核心觀點&#xff0c;揭示科技巨頭的未來十年…

4.2 學習UVM中的“connect_phase“,將其應用到具體案例分為幾步?

文章目錄 前言1. connect_phase 的作用與執行順序2. TLM 連接的類型與示例2.1 生產者-消費者模型2.2 分析端口廣播模型 3. 層次化連接示例4. 動態連接與條件化配置5. 關鍵注意事項6. 完整示例&#xff1a;SoC 驗證環境連接6.1 Monitor 廣播數據6.2 Scoreboard 和 Coverage6.3 E…