數據結構 —— 圖的遍歷

數據結構 —— 圖的遍歷

  • BFS(廣度遍歷)
  • 一道美團題
  • DFS(深度遍歷)

我們今天來看圖的遍歷,其實都是之前在二叉樹中提過的方法,深度和廣度遍歷

在這之前,我們先用一個鄰接矩陣來表示一個圖:

#pragma once
#include<iostream>
#include<vector>
#include<map>
using namespace std;//圖的模板化
namespace matrix
{template<class V, class W, W MAX_W, bool Direction = false>class Graph{public:Graph(const V* vertex, size_t n){//開辟空間_vertex.reserve(n);for (int i = 0; i < n; i++){_vertex.push_back(vertex[i]);_index[vertex[i]] = i;}//初始化矩陣_matrix.resize(n);for (auto& e : _matrix){e.resize(n, MAX_W);}}//尋找圖中的點size_t FindSrci(const V& vertex){auto ret = _index.find(vertex);if (ret != _index.end()){return ret->second;}else{throw invalid_argument("不存在的頂點");return -1;}}void _AddEdge(size_t srci, size_t desi, W w){_matrix[srci][desi] = w;if (Direction == false){_matrix[desi][srci] = w;}}//加邊void AddEdge(const V& srci, const V& desi, W w){size_t srcIndex = FindSrci(srci);size_t desIndex = FindSrci(desi);_AddEdge(srcIndex, desIndex, w);}void Print(){//打印標題行cout << "      ";for (int i = 0; i < _vertex.size(); i++){cout << _vertex[i] << " ";}cout << endl;//打印矩陣for (int i = 0; i < _vertex.size(); i++){cout << _vertex[i] << " ";for (int j = 0; j < _matrix[i].size(); j++){if (_matrix[i][j] != MAX_W){printf("%5d", _matrix[i][j]);}else{printf("%5c", '#');}}cout << endl;}}private://存放頂點vector<V> _vertex;//映射關系map<V, size_t> _index;//矩陣,圖的表示vector<vector<W>> _matrix;};void TestGraph(){Graph<char, int, INT_MAX, true> g("0123", 4);g.AddEdge('0', '1', 1);g.AddEdge('0', '3', 4);g.AddEdge('1', '3', 2);g.AddEdge('1', '2', 9);g.AddEdge('2', '3', 8);g.AddEdge('2', '1', 5);g.AddEdge('2', '0', 3);g.AddEdge('3', '2', 6);g.Print();}void TestGraph2(){string a[] = {"海皇","高斯","小傲","小潮","胖迪","小楊","皖皖"};Graph<string, int,INT_MAX, false> g1(a, sizeof(a)/sizeof(a[0]));g1.AddEdge("小潮", "小傲", 30);g1.AddEdge("小潮", "高斯", 83);g1.AddEdge("小潮", "海皇", 34);g1.AddEdge("胖迪", "海皇", 78);g1.AddEdge("胖迪", "小傲", 76);g1.AddEdge("小楊", "皖皖", 54);g1.AddEdge("小楊", "高斯", 48);g1.Print();}
}

在這里插入圖片描述在這里插入圖片描述

BFS(廣度遍歷)

廣度優先遍歷和之前二叉樹的廣度優先遍歷一樣,我們需要隊列來輔助
在這里插入圖片描述我們邏輯上是這張圖,但是我們實際遍歷的時候,我們遍歷的是一個矩陣(二維數組)
在這里插入圖片描述因為這個圖是聯通圖,我們從任意一個頂點出發都可以遍歷完所有頂點,假設我們從小潮開始:
在這里插入圖片描述我們仿照二叉樹那里的思路,把相連的節點入隊列,把小傲,高斯,海皇入隊列:
在這里插入圖片描述在矩陣上的表現就是把小潮這一行,不為#的數值的結點入隊列
在這里插入圖片描述好,現在有一個問題,假設我現在遍歷到了海皇,海皇和小潮相連,按照上面的規則,我們應該把小潮入隊列,但是我們一開始就是從小潮開始的,就會造成重復訪問,這該則么辦呢?

所以在圖這里,我們要引入一個數組,標記我們已經訪問過的結點,標記過的結點在之后的訪問過程中不再入隊

在這里插入圖片描述
我們來實現一下:

	void BFS(const V& vertex){int vertexIndex = FindSrci(vertex);//隊列和標記數組int n = _vertex.size();queue<size_t> q;vector<bool> visited(n, false);//先入最先訪問節點q.push(vertexIndex);//標記visited[vertexIndex] = true;while (!q.empty()){//出隊size_t front = q.front();q.pop();cout << _vertex[front] << " ";//遍歷該行for (int i = 0; i < _vertex.size(); i++){if (_matrix[front][i] != MAX_W){if (visited[i] == false){q.push(i);visited[i] = true;}}}cout << endl;}}

一道美團題

在這里插入圖片描述讀了題之后,這里讓我們計算幾度好友,其實我們在BFS已經按照一度二度的順序打印了,但是我們沒有區分,我們區分一下就可以了

void BFS(const V& vertex)
{// 獲取目標頂點的索引int vertexIndex = FindSrci(vertex);// 初始化隊列和標記數組int n = _vertex.size();queue<size_t> q; // 創建一個隊列用于存儲待訪問的頂點vector<bool> visited(n, false); // 創建一個布爾數組,用于標記頂點是否已被訪問// 將起始頂點添加到隊列中,并標記為已訪問q.push(vertexIndex);visited[vertexIndex] = true;int levelSize = 1; // 初始化當前層級的頂點數量,初始時只有起始頂點int degree = 0; // 初始化度數(即好友的層次)// 當隊列非空時,繼續廣度優先搜索while (!q.empty()){// 輸出當前度數的好友cout << "[" << degree << "]" << "度好友 ";// 對當前層級的所有頂點進行處理for (int j = 0; j < levelSize; j++){// 從隊列中取出一個頂點size_t front = q.front();q.pop();// 輸出當前頂點的信息cout << _vertex[front] << " ";// 遍歷與當前頂點相鄰的所有頂點for (int i = 0; i < _vertex.size(); i++){// 如果存在一條邊連接當前頂點和下一個頂點if (_matrix[front][i] != MAX_W){// 如果下一個頂點未被訪問過if (!visited[i]){// 將下一個頂點添加到隊列中,以便后續訪問q.push(i);// 標記下一個頂點為已訪問visited[i] = true;}}}}// 更新下一層級的頂點數量levelSize = q.size();// 換行輸出,準備進入下一度數的好友輸出cout << endl;// 增加度數計數器degree++;}// 最終換行,使輸出更清晰cout << endl;
}

在這里插入圖片描述

DFS(深度遍歷)

深度遍歷是一條道走到黑:
在這里插入圖片描述

// 深度優先搜索的私有輔助函數
void _DFS(size_t vertexIndex, vector<bool>& visited)
{// 如果當前頂點尚未訪問過if (!visited[vertexIndex]){// 輸出當前頂點的值cout << _vertex[vertexIndex] << endl;// 將當前頂點標記為已訪問visited[vertexIndex] = true;// 遍歷所有頂點for (size_t i = 0; i < _vertex.size(); i++){// 如果當前頂點和遍歷到的下一個頂點之間存在邊,// 表示為權重不是最大可能權重(MAX_W),// 則對下一個頂點進行深度優先搜索if (_matrix[vertexIndex][i] != MAX_W)_DFS(i, visited);}}
}// 公開的深度優先搜索函數,從給定的頂點開始
void DFS(const V& vertex)
{// 查找給定頂點在頂點列表中的索引size_t vertexIndex = FindSrci(vertex);// 初始化一個布爾向量來跟蹤每個頂點是否已被訪問vector<bool> visited(_vertex.size(), false);// 調用私有輔助函數進行深度優先搜索_DFS(vertexIndex, visited);
}

在這里插入圖片描述
(注:本人是小潮院長粉絲,該文章中舉的例子不代表真實好友關系,無意挑撥小潮院長內部成員關系,如有冒犯,請不要打我…)

在這里插入圖片描述

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

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

相關文章

220千伏變電站輔助設備智能監控平臺 無人化與自動化升級改造工程

220千伏變電站特點 高電壓等級&#xff1a;220千伏變電站的最大特點是其高壓傳輸能力&#xff0c;能夠將發電廠產生的電能高效地傳輸到較遠的地區&#xff0c;滿足大型城市及工業區域的用電需求。 輸電能力大&#xff1a;220千伏變電站在輸電能力上遠大于普通的110千伏或更低…

Mybatis框架的集成使用

1_框架概述 框架是一個半成品&#xff0c;已經對基礎的代碼進行了封裝并提供相應的API&#xff0c;開發者在使用框架時直接調用封裝好的api可以省去很多代碼編寫&#xff0c;從而提高工作效率和開發速度,框架是一種經過校驗、具有一定功能的半成品軟件. 經過校驗&#xff1a;指…

【超萬卡GPU集群關鍵技術深度分析 2024】

文末有福利&#xff01; 1. 集群高能效計算技術 隨著大模型從千億參數的自然語言模型向萬億參數的多模態模型升級演進&#xff0c;超萬卡集群吸需全面提升底層計算能力。 具體而言&#xff0c;包括增強單芯片能力、提升超節點計算能力、基于 DPU (Data Processing Unit) 實現…

淺聊權限系統設計模型

淺聊權限系統設計模型 設計權限目的 目前主流的各類權限管理模型,如基于用戶、角色組、實體等等的權限模型,結合產品本身的業務、面臨的問題和未來的發展兼容,進行權限模型選型,找到適合產品本身的權限范式體系。 權限模型類型 ACL:權限控制列表(Access Control List)D…

Mx Admin 基于react18的后臺管理系統

前言 Mx Admin 基于React18 vite5 antd5的后臺管理系統&#xff0c; 基于RBAC的權限控制系統&#xff0c;動態菜單和動態路由支持tab路由緩存嵌套菜單支持多種菜單布局模式亮暗色主題切換

Enzo Life Sciences熱點分享:細胞治療中的T細胞活化

細胞治療&#xff08;Cell Therapy&#xff09;作為一種新近發展起來的癌癥治療方法&#xff0c;是一種利用患者自體&#xff08;或異體&#xff09;的成體細胞&#xff08;或干細胞&#xff09;對組織、器官進行修復的治療方法。通常是由免疫細胞和相關的細胞產生調節細胞功能…

Java判斷范圍型的數據是否存在重疊(數值類型、日期類型)

為什么寫這么一篇文章呢&#xff1f; 遇到了個問題&#xff0c;同一天可以輸入多個時間段&#xff0c;但是每個時間段的時間不能出現重疊。 納尼&#xff0c;這不就是判斷數據返回是否有重疊的變種嘛~ 簡單&#xff0c;開搞 數字范圍是否重疊判斷 這里以int類型為例了&…

linux配置qqbot(Mirai+Alicebot)

雖然最終沒有成功配置好qqbot&#xff0c;但是感覺這個過程還是值得記錄的&#xff0c;所以寫出了下文 最終因為登陸qq時的code45問題導致沒有成功登錄&#xff0c;據說更換qq號或者配置簽名服務器是有可能可行的。 安裝環境 安裝mcl&#xff08;mirai的控制臺&#xff09; …

【單片機畢業設計選題24046】-基于單片機的智能魚缸設計

系統功能: 檢測水溫&#xff0c;水溫過低開啟PTC加熱。檢測水位&#xff0c;水位過低開啟水泵抽水。檢測濕度&#xff0c;濕度過高則開啟風扇通風。 檢測PH值和渾濁度&#xff0c;TTS語音播報功能&#xff0c;OLED顯示系統信息&#xff0c;藍牙模塊連接手機APP。 系統上電后…

IT專業入門,高考假期預習指南—初識產品經理BRD、MRD 和 PRD

七月來臨&#xff0c;各省高考分數已揭榜完成。而高考的完結并不意味著學習的結束&#xff0c;而是新旅程的開始。對于有志于踏入IT領域的高考少年們&#xff0c;這個假期是開啟探索IT世界的絕佳時機。作為該領域的前行者和經驗前輩&#xff0c;你是否愿意為準新生們提供一份全…

AI 芯片之戰:開啟智能新時代的關鍵角逐

在科技發展的浪潮中&#xff0c;一場圍繞 AI 芯片的激烈競爭正在全球范圍內如火如荼地展開。多家巨頭紛紛投身其中&#xff0c;使得這場混戰已然進入白熱化階段。 AI 芯片&#xff0c;作為推動人工智能發展的核心硬件&#xff0c;其作用舉足輕重。它能夠高效地處理海量的數據&a…

生物分子生物學實驗過程的自動化與智能監控系統設計

開題報告&#xff1a;生物分子生物學實驗過程的自動化與智能監控系統設計 一、引言 隨著生物科學技術的飛速發展&#xff0c;生物分子生物學實驗在科研、醫療、農業等領域的應用日益廣泛。然而&#xff0c;傳統的生物分子生物學實驗過程大多依賴于人工操作&#xff0c;存在操…

java web 部分

jsp作用域由大到小 過濾器有哪些作用&#xff1f; 過濾器的用法&#xff1f;&#xff08;對客戶端的請求統一編碼和對客戶端進行認證&#xff09; JSP和Servlet中的請求轉發分別如何實現&#xff1f; JSP 和 Servlet 有哪些相同點和不同點&#xff0c;他們之間的聯系是什么…

PCB設計時,信號走線要先過ESD/TVS管,這是為什么?

目錄 為什么有上面這個問題&#xff1f; 問題的原因——走線電感 走線電感的阻抗 電感的影響 小結 都說接口處的信號要先過ESD/TVS管&#xff0c;然后拉到被保護器件&#xff0c;為什么不這樣做效果就不好&#xff1f;那如果受板子實際情況限制&#xff0c;必須這樣layout…

Python - 單引號與雙引號

Python 版本 3.11.4 字符串 單個文字符稱為字符&#xff0c;多個文字符成為字符串。 字符串需要被&#xff08;單引號&#xff09;或者""&#xff08;雙引號&#xff09;包括。 language "Python"language Python 以上寫法都是合法的。 單引號與雙…

Zabbix 配置MySQL數據庫監控

Zabbix MySQL數據庫監控簡介 通過 Zabbix 監控 MySQL 數據庫&#xff0c;可以獲取有關數據庫性能、運行狀況和資源使用情況的詳細信息&#xff0c;幫助及時發現和解決問題。 Zabbix官方提供了一個名為MySQL by Zabbix agent的監控模板&#xff0c;該模板專為 Zabbix 通過 Zabb…

探索Vim表達式寄存器:提升文本處理的高級技巧

探索Vim表達式寄存器&#xff1a;提升文本處理的高級技巧 Vim是一款功能強大的文本編輯器&#xff0c;它擁有豐富的寄存器系統&#xff0c;用于存儲文本、命令等。表達式寄存器是Vim中一種特殊的寄存器&#xff0c;允許用戶存儲并操作表達式的結果。本文將詳細介紹如何在Vim中…

使用Spring Boot和mkcert解決本地及局域網HTTPS訪問

在現代Web開發中&#xff0c;HTTPS已經成為保障數據傳輸安全的標準。然而&#xff0c;在開發和測試階段&#xff0c;配置HTTPS可能會帶來一些額外的復雜性。尤其是在本地開發環境和局域網內網環境中&#xff0c;獲得和配置證書通常是一個挑戰。本文將介紹如何使用Spring Boot和…

關于在自己的生活里面,增加喝咖啡的這道手續

前言&#xff1a;我總在告訴我自己&#xff0c;我自己應該如何&#xff1f;我的未來應該如何&#xff1f;到那時實際上&#xff0c;自己沒有辦法能夠理解的確實我的現在&#xff0c;我應該依靠咖啡度過我自己剩下的歲月&#xff0c;接下來&#xff0c;讓自己用自己的方式來不斷…

華為5288 V5服務器安裝BCLinux8U4手記

本文記錄了華為5288 V5服務器安裝BCLinux8U4操作系統的過程。 一、系統環境 1、服務器 華為FusionServer Pro 5288 V5服務器 2、操作系統 BCLinux-R8-U4-Server-x86_64-220725.iso 官網下載地址 sha256sum&#xff1a;1d31d3b8e02279e89965bd3bea61f14c65b9d32ad2ab6d4eb…