數據結構——圖(三、圖的 廣度/深度 優先搜索)

一、廣度優先搜索(BFS)

①找到與一個頂點相鄰的所有頂點
②標記哪些頂點被訪問過
③需要一個輔助隊列

#define MaxVertexNum 100
bool visited[MaxVertexNum];  //訪問標記數組 
void BFSTraverse(Graph G){  //對圖進行廣度優先遍歷,處理非連通圖的函數 for(int i=0;i<G.vexnum;i++)// 遍歷一下所有的 頂點visited[i] = false;    // 將所有的頂點都  設為 未訪問標志。InitQueue(Q);    //初始化輔助隊列Q for(int i=0;i<G.vexnum;i++)// 從0號頂點開始遍歷if(!visited[i])        // 對每個連通分量調用一次BFS() BFS(G,i);    
}
void BFS(Graph G,int v){visit(v);visited[V]=true;   //對v做已訪問標記 EnQueue(Q,v);   //頂點v入隊 while(isEmpty(Q)){Dequeue(Q,v);   //隊首頂點v出隊 //for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))for(p=G.vertices[v].firstarc;p;p=p->nextarc){  //檢測v的所有鄰接點 w=p->adjvex;if(visited[w]==false){visit(w);  //w為v尚未訪問的鄰接點,訪問w visited[w]=true;  // 對w做已訪問標記 EnQueue(Q,w);  // 頂點w入隊 }        	}}
}

無論是鄰接矩陣還是鄰接表的存儲方式,BFS算法都需要借助一個輔助隊列Q,
n個頂點均需要入隊一次,在最壞的情況下,空間復雜度為O(|V|)

BFS遍歷圖的實質就是對每個頂點查找其鄰接點的過程,耗費時取決于存儲結構。
1、采用鄰接表存儲,每個頂點均需搜索(或入隊)一次,時間復雜度為O(|V|),在搜索每個頂點的鄰接點時
每條邊至少被訪問一次,時間復雜度為O(|E|),總的時間復雜度為 O(|V|+|E|)
2、采用鄰接矩陣存儲,查找每個頂點的鄰接點所需要的時間為O(|V|),總的時間復雜度為O(|V|2)?

同一個圖的鄰接矩陣存儲是唯一的,所以其廣度優先生成樹也是唯一的。
但因為鄰接表存儲表示不唯一,所以其廣度優先生成樹也是不唯一。?

廣度優先搜索的應用——只可以檢測無向圖是否有環,有向圖無法檢測

二、深度優先搜索(DFS)

DFS算法是一個遞歸算法,需要借助一個遞歸工作棧,最好的空間復雜度是O(1),最差的空間復雜度是O(|V|)

DFS遍歷圖的實質就是對每個頂點查找其鄰接點的過程,耗費時取決于存儲結構。
1、采用鄰接表存儲,每個頂點均需搜索(或入隊)一次,時間復雜度為O(|V|),在搜索每個頂點的鄰接點時
每條邊至少被訪問一次,時間復雜度為O(|E|),總的時間復雜度為 O(|V|+|E|)
2、采用鄰接矩陣存儲,查找每個頂點的鄰接點所需要的時間為O(|V|),總的時間復雜度為O(|V|2) ?

#define MAX_VERTEX_NUM 100
bool visited[MAX_VERTEX_NUM]; //訪問標記數組 
void DFSTraverse(Graph G)  //對圖進行深度優先遍歷 
{for(v=0;v<G.vexnum;i++)visited[v]=false;   //初始化已訪問標記數組 for(v=0;v<G.vexnum;i++)   //本代碼是從v0開始遍歷 if(!visited[v])   //對尚未訪問的頂點調用DFS() DFS(G,v);
}//用鄰接表實現深度優先搜索算法 
void DFS(ALGraph G,int v)
{visit(v);   visited[v]=true;for(p=G.vertices[v].firstarc;p;p=p->nextarc){  //檢測v的所有鄰接點 j=p->adjvex;if(!visited[w])DFS(G,w);    	  //j為v的尚未訪問鄰接點,遞歸訪問v }}//用鄰接矩陣實現深度優先搜索算法 
void DFS(MLGraph G,int v)
{visit(v);   visited[v]=true;for(j=0;j<G.vexnum;j++){  //檢測v的所有鄰接點 if(visited[j]==false && G.edge[i][j]==1)DFS(G,j);    	  //j為v的尚未訪問鄰接點,遞歸訪問v }}

深度優先搜索應用——檢測是否有向圖/無向圖是否有環

比如,無向圖,先訪問結點1,再訪問結點2,再訪問結點5,再訪問結點3,此時結點3有兩個鄰接點,在先訪問結點2的情況下,發現結點2已經被訪問過,并且不是結點3的父節點,結點3的父節點是它的來時路——結點5。則此時,圖里存在環。

?三、圖的遍歷與連通性

1、對于無向圖來說,若無向圖是連通的,則從任意一個結點出發,僅需一次遍歷就能訪問圖中所有頂點;若無向圖是非連通的,則從某一個頂點出發,一次性只能訪問到該頂點所在連通分量的所有頂點?
2、對于無向圖,BFSTraverse、 DFSTraverse這兩個函數調用BFS、DFS的次數等于該圖的連通分量?
3、對于有向圖來說,若從初始頂點到圖中的每個頂點都有路徑,則能夠訪問到圖中的所有頂點,否則不能訪問到所有頂點。(即與是否為強連通圖無關)
4、對于有向圖,非強連通分量一次調用不一定能訪問到該子圖的所有頂點。?

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

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

相關文章

直擊WAIC | 百度袁佛玉:加速具身智能技術及產品研發,助力場景應用多樣化落地

7月26日&#xff0c;2025世界人工智能大會暨人工智能全球治理高級別會議&#xff08;WAIC&#xff09;在上海開幕。同期&#xff0c;由國家地方共建人形機器人創新中心&#xff08;以下簡稱“國地中心”&#xff09;與中國電子學會聯合承辦&#xff0c;百度智能云、中國聯通上海…

2025年人形機器人動捕技術研討會將在本周四召開

2025年7月31日愛迪斯通所主辦的【2025人形機器動作捕捉技術研討會】是攜手北京天樹探界公司線下活動結合線上直播的形式&#xff0c;會議將聚焦在“動作捕捉軟硬件協同&#xff0c;加速人形機器人訓練”&#xff0c;將深度講解多項核心技術&#xff0c;包含全球知名的慣性動捕大…

Apple基礎(Xcode①-項目結構解析)

要運行設備之前先選擇好設備Product---->Destination---->選擇設備首次運行手機提示如出現 “未受信任的企業級開發者” → 手機打開 設置 ? 通用 ? VPN與設備管理 → 信任你的 Apple ID 即可ContentView 是 SwiftUI 項目里 最頂層、最主界面 的那個“頁面”&#xff0…

微服務 02

一、網關路由網關就是網絡的關口。數據在網絡間傳輸&#xff0c;從一個網絡傳輸到另一網絡時就需要經過網關來做數據的路由和轉發以及數據安全的校驗。路由是網關的核心功能之一&#xff0c;決定如何將客戶端請求映射到后端服務。1、快速入門創建新模塊&#xff0c;引入網關依賴…

04動手學深度學習筆記(上)

04數據操作 import torch(1)張量表示一個數據組成的數組&#xff0c;這個數組可能有多個維度。 xtorch.arange(12) xtensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])(2)通過shape來訪問張量的形狀和張量中元素的總數 x.shapetorch.Size([12])(3)number of elements表…

MCU中的RTC(Real-Time Clock,實時時鐘)是什么?

MCU中的RTC(Real-Time Clock,實時時鐘)是什么? 在MCU(微控制器單元)中,RTC(Real-Time Clock,實時時鐘) 是一個獨立計時模塊,用于在系統斷電或低功耗狀態下持續記錄時間和日期。以下是關于RTC的詳細說明: 1. RTC的核心功能 精準計時:提供年、月、日、時、分、秒、…

Linux 進程調度管理

進程調度器可粗略分為兩類&#xff1a;實時調度器(kernel)&#xff0c;系統中重要的進程由實時調度器調度&#xff0c;獲得CPU能力強。非實時調度器(user)&#xff0c;系統中大部分進程由非實時調度器調度&#xff0c;獲得CPU能力弱。實時調度器實時調度器支持的調度策略&#…

基于 C 語言視角:流程圖中分支與循環結構的深度解析

前言&#xff08;約 1500 字&#xff09;在 C 語言程序設計中&#xff0c;控制結構是構建邏輯的核心骨架&#xff0c;而流程圖作為可視化工具&#xff0c;是將抽象代碼邏輯轉化為直觀圖形的橋梁。對于入門 C 語言的工程師而言&#xff0c;掌握流程圖與分支、循環結構的對應關系…

threejs創建自定義多段柱

最近在研究自定義建模&#xff0c;有一個多斷柱模型比較有意思&#xff0c;分享下&#xff0c;就是利用幾組點串&#xff0c;比如上中下&#xff0c;然后每組點又不一樣多&#xff0c;點續還不一樣&#xff0c;(比如第一個環的第一個點在左邊&#xff0c;第二個環在右邊)&#…

Language Models are Few-Shot Learners: 開箱即用的GPT-3(四)

Result續 Winograd-Style Tasks Winograd-Style Tasks 是自然語言處理中的一類經典任務。它源于 Winograd Schema Challenge(WSC),主要涉及確定代詞指的是哪個單詞,旨在評估模型的常識推理和自然語言理解能力。 這個任務中的具體通常包含高度歧義的代詞,但從語義角度看…

BGP高級特性之認證

一、概述BGP使用TCP作為傳輸協議&#xff0c;只要TCP數據包的源地址、目的地址、源端口、目的端 口和TCP序號是正確的&#xff0c;BGP就會認為這個數據包有效&#xff0c;但數據包的大部分參數對于攻擊 者來說是不難獲得的。為了保證BGP免受攻擊&#xff0c;可以在BGP鄰居之間使…

商旅平臺怎么選?如何規避商旅流程中的違規風險?

在中大型企業的商旅管理中&#xff0c;一個典型的管理“黑洞”——流程漏洞與超標正持續吞噬企業成本與管理效能&#xff1a;差標混亂、審批脫節讓超規訂單頻頻闖關&#xff0c;不僅讓企業商旅成本超支&#xff0c;還可能引發稅務稽查風險。隱性的合規風險&#xff0c;比如虛假…

Anaconda的常用命令

Anaconda 是一個用于科學計算、數據分析和機器學習的 Python 發行版&#xff0c;包含了大量的預安裝包。它配有 conda 命令行工具&#xff0c;方便用戶管理包和環境。以下是一些常用的 conda 命令和 Anaconda 的常見操作命令&#xff0c;幫助你高效管理環境和包。1. 環境管理創…

JVM之【Java虛擬機概述】

目錄 對JVM的理解 JVM的架構組成 類加載系統 執行引擎 運行時數據區 垃圾收集系統 本地方法庫 對JVM的理解 JVM保證了Java程序的執行&#xff0c;同時也是Java語言具有跨平臺性的根本原因&#xff1b;Java源代碼通過javac等前端編譯器生成的字節碼計算機并不能識別&…

RabbitMQ+內網穿透遠程訪問教程:實現異地AMQP通信+Web管理

RabbitMQ是一個開源的消息隊列中間件&#xff0c;基于Erlang開發&#xff0c;遵循AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;高級消息隊列協議&#xff09;標準&#xff0c;主要用于實現異步通信、消息解耦和系統間數據傳輸。它的核心作用是在分布式系統中…

go 語言 timer 與 ticker理論和實例大全

目錄 1. 時間之門的鑰匙:Timer與Ticker的本質 2. Timer:精準的單次計時 2.1 Timer的基礎用法 2.2 停止與重置Timer 2.3 Timer的高級技巧:優雅處理并發 3. Ticker:時間的節拍器 3.1 Ticker的基本用法 3.2 Ticker的高級應用:動態調整周期 4. Timer與Ticker的結合:打…

MySQL 45講 16-17

全字段排序 explain 中的 using fiesort ,掃描 數據,取出符合判斷條件的 數據,到sort buffer中,然后對排序字段采用快速排序進行 排序后直接將 所需字段進行返回 如果 字段長度所占內存大于所分配 的sort buffer ,需要借助 臨時文件 進行 數據的存放排序,此時會采用 歸并排序,將…

QT項目 -仿QQ音樂的音樂播放器(第四節)

一、RecBox中btUp和btDown按鈕clicked處理 選中左右鍵&#xff08;btUp和btDown按鈕&#xff09;然后右擊轉到槽->click() void RecBox::on_btUp_clicked() {}void RecBox::on_btDown_clicked() {} 二、imageList中圖片分組 // recbox.h 中新增 int currentIndex; // 標記…

DeepSeek SEO關鍵詞優化提升流量增長

內容概要DeepSeek SEO關鍵詞優化致力于通過科學的方法&#xff0c;顯著提升網站在搜索引擎中的可見度與自然流量。其核心在于深入理解并精準匹配用戶的真實搜索意圖&#xff0c;而非僅僅堆砌詞匯。具體來說&#xff0c;該策略運用深度意圖導向策略&#xff0c;確保內容與用戶需…

# Ubuntu 系統設置 USB PnP 音頻設備為默認設備的完整教程

Ubuntu 系統設置 USB PnP 音頻設備為默認設備的完整教程 在使用 Ubuntu 系統時&#xff0c;尤其是在嵌入式設備如 NVIDIA Jetson 系列上&#xff0c;我們經常需要將 USB PnP 音頻設備設置為默認設備。本文將詳細介紹如何通過命令行配置&#xff0c;使 USB PnP 音頻設備在系統重…