BFS算法篇——廣度優先搜索,探索未知的旅程(上)

文章目錄

  • 前言
  • 一、BFS的思路
  • 二、BFS的C語言實現
    • 1. 圖的表示
    • 2. BFS的實現
  • 三、代碼解析
  • 四、輸出結果
  • 五、總結

在這里插入圖片描述

前言

廣度優先搜索(BFS)是一種廣泛應用于圖論中的算法,常用于尋找最短路徑、圖的遍歷等問題。與深度優先搜索(DFS)不同,BFS通過層級地探索節點來確保最先訪問的節點距離源點較近,因此它可以用來求解最短路徑問題。讓我們深入了解這個算法,并通過具體的例子和代碼來進一步掌握它的實現。

一、BFS的思路

BFS的主要思想是從起始節點開始,首先訪問該節點的所有鄰接節點,然后再訪問這些鄰接節點的鄰接節點。BFS利用隊列的先進先出(FIFO)特性保證了節點是按層次順序被訪問的。

二、BFS的C語言實現

1. 圖的表示

在C語言中,我們常用鄰接表來表示圖。對于無向圖,我們可以使用一個鄰接矩陣或者鄰接鏈表。在這里,我們采用鄰接鏈表表示圖。

2. BFS的實現

以下是C語言實現BFS算法的具體代碼,圖使用鄰接表表示:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>#define MAX_NODES 6  // 節點數量// 圖的鄰接表結構
typedef struct Node {int data;struct Node* next;
} Node;typedef struct Graph {Node* adjList[MAX_NODES];
} Graph;// 隊列結構
typedef struct Queue {int items[MAX_NODES];int front, rear;
} Queue;// 創建一個新的圖
Graph* createGraph() {Graph* graph = (Graph*)malloc(sizeof(Graph));for (int i = 0; i < MAX_NODES; i++) {graph->adjList[i] = NULL;}return graph;
}// 向圖中添加一條邊
void addEdge(Graph* graph, int src, int dest) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = dest;newNode->next = graph->adjList[src];graph->adjList[src] = newNode;// 因為是無向圖,所以添加反向邊newNode = (Node*)malloc(sizeof(Node));newNode->data = src;newNode->next = graph->adjList[dest];graph->adjList[dest] = newNode;
}// 初始化隊列
void initQueue(Queue* q) {q->front = -1;q->rear = -1;
}// 入隊
void enqueue(Queue* q, int value) {if (q->rear == MAX_NODES - 1) {printf("隊列已滿\n");return;}if (q->front == -1) {q->front = 0;}q->rear++;q->items[q->rear] = value;
}// 出隊
int dequeue(Queue* q) {if (q->front == -1) {printf("隊列為空\n");return -1;}int item = q->items[q->front];q->front++;if (q->front > q->rear) {q->front = q->rear = -1;}return item;
}// 判斷隊列是否為空
bool isQueueEmpty(Queue* q) {return q->front == -1;
}// 廣度優先搜索BFS
void bfs(Graph* graph, int start) {bool visited[MAX_NODES] = {false};  // 訪問標志數組Queue q;initQueue(&q);// 標記起始節點為已訪問,并入隊visited[start] = true;enqueue(&q, start);while (!isQueueEmpty(&q)) {// 出隊并訪問節點int node = dequeue(&q);printf("%c ", node + 'A');  // 輸出節點(假設節點是字母A, B, C...)// 遍歷當前節點的所有鄰接節點Node* temp = graph->adjList[node];while (temp) {int adjNode = temp->data;if (!visited[adjNode]) {visited[adjNode] = true;enqueue(&q, adjNode);}temp = temp->next;}}
}int main() {// 創建圖并添加邊Graph* graph = createGraph();addEdge(graph, 0, 1);  // A - BaddEdge(graph, 0, 2);  // A - CaddEdge(graph, 1, 3);  // B - DaddEdge(graph, 1, 4);  // B - EaddEdge(graph, 2, 4);  // C - EaddEdge(graph, 3, 5);  // D - FaddEdge(graph, 4, 5);  // E - F// 執行BFS從節點A(索引0)開始printf("BFS遍歷結果: ");bfs(graph, 0);// 釋放內存free(graph);return 0;
}

三、代碼解析

圖的表示:

  • 圖使用鄰接表表示。每個節點用一個鏈表來存儲與其直接相連的節點。Graph結構體中有一個數組 adjList 來保存所有節點的鄰接鏈表。

隊列的實現:

  • 隊列用數組來實現,包含 front 和 rear 來管理隊列的操作。隊列用于按順序訪問圖的每個節點。

BFS的實現:

  • 使用隊列來管理待訪問的節點。首先將起始節點標記為已訪問并入隊。然后逐步出隊并訪問節點,訪問節點的鄰接節點,如果鄰接節點未被訪問,則將其標記為已訪問并入隊。
  • 輸出遍歷的節點(假設節點為字母,如 A, B, C, …)。

四、輸出結果

假設圖的結構如下所示:

    A -- B -- D|    |    |C -- E -- F

輸出結果將為:

BFS遍歷結果: A B C D E F 

這意味著從節點 A 開始,BFS按層次遍歷的順序訪問了圖中的所有節點。

五、總結

  • BFS是一種通過逐層擴展來遍歷圖的算法,通常用于求解最短路徑問題、圖的遍歷等。
  • 在C語言中,BFS通常使用隊列來實現,隊列的先進先出特性確保了圖的層次遍歷。
  • 本例中通過鄰接表表示圖,使用隊列來實現BFS遍歷,從而找到節點間的最短路徑。
  • 廣度優先搜索在實際問題中具有廣泛的應用,例如在社交網絡分析、路徑規劃等方面,都可以發揮其強大的作用。

本篇關于BFS算法篇的介紹就暫告段落啦,希望能對大家的學習產生幫助,歡迎各位佬前來支持斧正!!!

在這里插入圖片描述

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

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

相關文章

解決使用python提取word文檔中所有的圖片時圖片丟失的問題

python解析word文檔&#xff0c;提取文檔中所有的圖片并保存&#xff0c;并將原圖位置用占位符替換。 問題描述 利用python-dox庫解析word文檔&#xff0c;并提取里面的所有圖片時發現會出現一摸一樣的圖片只解析一次&#xff0c;導致圖片丟失&#xff0c;數量不對的情況。 …

Swipe橫滑與SwipeItem自定義橫滑相互影響

背景 vue項目&#xff0c;H5頁面&#xff0c;使用vant的組件庫輪播組件<Swipe>&#xff0c;UI交互要求&#xff0c;在每個SwipeItem中有內容&#xff0c;可自橫滑&#xff0c;查看列表內容 核心代碼 <template><Swipeclass"my_swipe":autoplay&quo…

3. 【.NET Aspire 從入門到實戰】--理論入門與環境搭建--環境搭建

構建現代云原生應用程序時&#xff0c;開發環境的搭建至關重要。NET Aspire 作為一款專為云原生應用設計的開發框架&#xff0c;提供了一整套工具、模板和集成包&#xff0c;旨在簡化分布式系統的構建和管理。開始項目初始化之前&#xff0c;確保開發環境的正確配置是成功的第一…

藍耘智算平臺使用DeepSeek教程

目錄 一.平臺架構與技術特點 二、DeepSeek R1模型介紹與優勢 DeepSeek R1 模型簡介 DeepSeek R1 模型優勢 三.藍耘智算平臺使用DeepSeek教程 展望未來 耘元生代智算云是藍耘科技推出的一款智算云平臺有著以下特點&#xff1a; 一.平臺架構與技術特點 基于 Kubernetes 原…

.net的一些知識點6

1.寫個Lazy<T>的單例模式 public class SingleInstance{private static readonly Lazy<SingleInstance> instance new Lazy<SingleInstance>(() > new SingleInstance());private SingleInstance(){}public static SingleInstance Instace > instance…

1Panel應用推薦:WordPress開源博客軟件和內容管理系統

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款現代化、開源的Linux服務器運維管理面板&#xff0c;它致力于通過開源的方式&#xff0c;幫助用戶簡化建站與運維管理流程。為了方便廣大用戶快捷安裝部署相關軟件應用&#xff0c;1Panel特別開通應用商店&am…

前端開發架構師Prompt指令的最佳實踐

前端開發架構師Prompt 提示詞可作為系統提示詞使用&#xff0c;可基于用戶的需求輸出對應的編碼方案。 本次提示詞偏向前端開發的使用&#xff0c;如有需要可適當修改關鍵詞和示例。 推薦使用 Cursor 中作為自定義指令使用Cline 插件中作為自定義指令使用在力所能及的范圍內使…

Linux在x86環境下制作ARM鏡像包

在x86環境下制作ARM鏡像包&#xff08;如qemu.docker&#xff09;&#xff0c;可以通過QEMU和Docker的結合來實現。以下是詳細的步驟&#xff1a; 安裝QEMU-user-static QEMU-user-static是一個靜態編譯的QEMU二進制文件&#xff0c;用于在非目標架構上運行目標架構的二進制文…

基于STM32設計的倉庫環境監測與預警系統

目錄 項目開發背景設計實現的功能項目硬件模塊組成設計思路系統功能總結使用的模塊的技術詳情介紹總結 1. 項目開發背景 隨著工業化和現代化的進程&#xff0c;尤其是在制造業、食品業、醫藥業等行業&#xff0c;倉庫環境的監控和管理成為了至關重要的一環。尤其是在存儲易腐…

Redis主從同步流程?

目錄 1. 建立連接 2. 全量同步(Full Sync) 3. 部分同步(Partial Sync) 4. 持續同步 5. 心跳檢測 6. 復制偏移量(Replication Offset) 7. 復制積壓緩沖區(Replication Backlog) 總結 Redis 主從同步 是通過復制(replication)實現的,主節點(master)將數據同…

PbootCMS 修改跳轉提示,修改笑臉時間

在使用時&#xff0c;每次都提示這個&#xff1a; 修改方法&#xff1a; 修改跳轉時間&#xff1a;找到 handle.php 文件編輯 &#xff0c;調整 setTimeout 函數的時間參數。 修改提示文字&#xff1a;編輯 handle.php 文件&#xff0c;修改提示文字的內容。 隱藏提示頁面&am…

三星手機為何不大力擴展中國市場?

三星在中國市場的手機銷量長期低迷&#xff0c;主要原因可以歸結為以下幾點&#xff0c;這也解釋了為什么三星可能沒有大力擴展中國市場的計劃&#xff1a; 1. 市場競爭激烈 中國市場已經被華為、OPPO、vivo、小米和蘋果等品牌牢牢占據&#xff0c;這些品牌在產品設計、本地化…

Elasticsearch:向量搜索的快速介紹

作者&#xff1a;來自 Elastic Valentin Crettaz 本文是三篇系列文章中的第一篇&#xff0c;將深入探討向量搜索&#xff08;也稱為語義搜索&#xff09;的復雜性&#xff0c;以及它在 Elasticsearch 中的實現方式。 本文是三篇系列文章中的第一篇&#xff0c;將深入探討向量搜…

kaggle視頻行為分析1st and Future - Player Contact Detection

這次比賽的目標是檢測美式橄欖球NFL比賽中球員經歷的外部接觸。您將使用視頻和球員追蹤數據來識別發生接觸的時刻&#xff0c;以幫助提高球員的安全。兩種接觸&#xff0c;一種是人與人的&#xff0c;另一種是人與地面&#xff0c;不包括腳底和地面的&#xff0c;跟我之前做的這…

低成本訓練的突破與爭議:DeepSeek R1模型的新進展

摘要 近日&#xff0c;李飛飛團隊宣稱以50美元成本訓練出性能超越o1/R1的DeepSeek R1模型&#xff0c;此說法引發廣泛質疑。與此同時&#xff0c;上海交通大學本科生提出一種新的低成本推理方法&#xff0c;可能成為新熱門選擇。有觀點認為&#xff0c;若認可50美元能訓練出更優…

Sentinel的安裝和做限流的使用

一、安裝 Release v1.8.3 alibaba/Sentinel GitHubA powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服務的高可用流控防護組件) - Release v1.8.3 alibaba/Sentinelhttps://github.com/alibaba/Senti…

“AI隱患識別系統,安全多了道“智能護盾”

家人們&#xff0c;在生活和工作里&#xff0c;咱們都知道安全那可是頭等大事。不管是走在馬路上&#xff0c;還是在工廠車間忙碌&#xff0c;又或是住在高樓大廈里&#xff0c;身邊都可能藏著一些安全隱患。以前&#xff0c;發現這些隱患大多靠咱們的眼睛和經驗&#xff0c;可…

《手札·避坑篇》信息化和數字化的本質區別

信息化與數字化&#xff1a;軸承貿易公司的轉型之路 在當今商業環境中&#xff0c;信息化和數字化是企業轉型的兩個熱門詞匯。但對于很多外行人來說&#xff0c;這兩個概念可能容易混淆。本文將從軸承貿易公司的角度&#xff0c;結合真實案例和數據&#xff0c;分析信息化與數字…

基于DeepSeek API和VSCode的自動化網頁生成流程

1.創建API key 訪問官網DeepSeek &#xff0c;點擊API開放平臺。 在開放平臺界面左側點擊API keys&#xff0c;進入API keys管理界面&#xff0c;點擊創建API key按鈕創建API key&#xff0c;名稱自定義。 2.下載并安裝配置編輯器VSCode 官網Visual Studio Code - Code Editing…

SolidWorks教程P2.2【草圖 | 第二節】——草圖幾何關系與編輯

草圖幾何關系包括&#xff1a;重合、中點、相切、平行、相等、共線、對稱 草圖編輯功能包括&#xff1a;裁剪實體、轉換實體引用、等距實體 目錄 1.草圖幾何關系 2.裁剪實體 3.轉換實體引用 4.等距實體 補充知識&#xff1a;智能尺寸 1.草圖幾何關系 在之前的草圖介紹里…