B站左神算法課學習筆記(P7):圖

目錄

一、圖的存儲方式(千奇百怪)

1)鄰接表

2)鄰接矩陣

3)其他

4)推薦存儲方式(代碼)

二、圖的遍歷

(1)寬度優先遍歷

(2)深度優先遍歷

?編輯?三、拓撲排序算法

四、kruskal與prim(針對無向圖)

(1)kruskal算法

(2)prim算法

五、Dijkstra算法


一、圖的存儲方式(千奇百怪

1)鄰接表

2)鄰接矩陣

3)其他

也可以用數組表示圖:

Q:一個數組arr,存儲一個沒有環的特殊圖,其每個位置上的數字代表其父節點(eg:arr[0] = 5表示0的父節點是5),以此類推可得到下面的圖:

使用小數組表示圖:

一個數組中每一個位置都存放著一個數組,它依次存儲【權重,起始點,中止點】,因此 [3, 0, 2] 就代表著有一條權重為3,從0開始,指到2的邊,其余以此類推:

由于表達圖的方式?千 奇 百 怪?,所以推薦:

(1)選擇一種習慣的圖表示方法,用該種表示方式來實現所有的圖的算法;

(2)想辦法將題中所給出來的圖轉化為自己熟悉的圖的表示方法,再運用寫好的算法即可!

4)推薦存儲方式(代碼)

一種供參考的圖的存儲方式:

轉化示例:

二、圖的遍歷

(1)寬度優先遍歷

區別二叉樹的寬度優先遍歷,因為圖中可能含有環!

仍然借助隊列實現(二叉樹的寬度優先遍歷也是借助隊列):?

結合畫圖理解:

tips:若需要進一步減少常數級別的耗時,可以采用數組來替換哈希表,因為數組的查詢比哈希表更快一些;?

(2)深度優先遍歷

借助棧和哈希表來實現:

結合下圖來理解:

中保存的是DFS的路線!


?三、拓撲排序算法

適用范圍:要求有向圖,且有入度為0的節點,沒有環。

常用環境:編譯順序

如下圖所示,假設編譯文件A需要先編譯文件BCD,編譯文件B又需要先編譯文件CDE,請問應該以什么樣的順序編譯整個文件?

算法思路:

? ? ? ? 1、先找到一個入度為0的點,記錄該點,并刪除其“影響”(此處指有向邊);

? ? ? ? 2、重復上述過程直到沒有未記錄的節點;

四、kruskal與prim(針對無向圖)

作用:生成最小生成樹(在保證連通性的情況下,確保邊的權值總和最小);

(1)kruskal算法

的角度出發考慮,對于所有邊,按照權重排序;依次連線上最小的邊,若會形成,則去掉這條邊。

檢查是否形成環會用到“并查集”的概念,該部分實現將會在后續課程涉及。

例1:

?例2:是否成環 == in節點和out節點是否屬于同一個集合中

并查集的簡單替換:(比并查集慢)

思路:定義一個setMap,里面存儲著每個節點和它所屬的集合;為主函數提供兩個方法——一個用于判斷from和to節點是否處于同一個集合中,另一個用于實現合并集合的操作。

有了上述的并查集結構后,我們可以實現k算法:

(2)prim算法

的角度出發考慮,從任意的點開始,標記該點使用過,對于該點可達的邊標記為解鎖狀態;選擇當前解鎖邊中兩側點不全出現過且權值最小的一條,將其標記為使用過,并標記該邊連接的另一個節點為使用過;重復上述直到用過所有點。

:假設從A開始,解鎖AB6、AC1、AD5三條邊;選擇AC1邊,解鎖CB5、CE6、CF4、CD5邊;選擇CD4邊,解鎖FE5、FD2邊;選擇FD2邊,無需解鎖;此時【ACFD】已經被使用,故只能選擇CB5而非CD5、AD,解鎖AB6、BE3;選擇BE3,已經遍歷所有點,p算法結束。

思考:為什么k算法需要并查集(集合查詢結構)而p算法不需要?

k算法可能出現已經連成將節點兩小片后再將兩邊相連成一大片的情況;而p算法總是選擇相鄰(已解鎖)的邊,使用哈希表即可。

代碼實現:

結合圖像理解:當A選擇B時,AB、AC會被添加,但是由于A、B兩點已經被食用過,所以會直接跳過AB邊而尋找其他邊!

五、Dijkstra算法

適用范圍:可以有權值為負數的邊,但是不能有累加和為負數的環!

作用:指定一個點,給出從該節點出發到所有其他點的最短距離。

算法流程:初始化一個距離表,將初始節點置為0,初始節點到其他節點的距離置為正無窮;每次從距離表中選取距離最近的節點,檢查其所有邊的權重,若從原點通過該點到達下一個點的距離更小,則更新距離表,否則不做處理;重復上述過程直至完成對所有點的遍歷。

例:

代碼實現:

堆優化思路:之前尋找最小值使用遍歷的方法,所以較慢,所以考慮使用堆來存儲數據;但是當權值更新后,不一定還能滿足堆的順序,此時需要對于其進行手動調整,只有這樣是最快的方式。

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

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

相關文章

深度解析「前綴和」與「差分法」:高效算法的基石

深度解析前綴和與差分法:高效算法的基石 在計算機科學和數據處理領域,前綴和(Prefix Sum)與差分法(Difference Method)是兩種基礎且高效的算法技術。它們在處理數組的區間查詢和區間修改操作時&#xff0c…

2-1 基本放大電路

放大的概念 mV →V mA→A 特征:放大功率(電壓與電流)。 本質:能量在控制下的轉換。(外接供電電源) 必要條件:有源元件(能量控制原件) 前提:不失真 測試的…

詳解接口的常見請求方式

詳解接口的常見請求方式 一、 常見接口請求方式1. GET2. POST3. PUT4. DELETE5. PATCH6. HEAD7. OPTIONS 二、 實現方法1. 前端實現2. 后端實現 三、 作用與主要區別四、 舉例講解1. 創建 Spring Boot 工程2. 添加依賴3. 編寫 Controller 實現接口關鍵點說明 4. 啟動與測試5. 總…

【附代碼】【MILP建模】3D裝箱問題(3D-Bin Packing Problem)

文章目錄 相關教程相關文獻問題描述建模思路——carton 方向平行軸建模方法(9變量6約束)平行軸建模方法(4變量8約束)枚舉建模方法(6變量1約束) 建模思路——carton 位置平行軸建模方法枚舉建模方法 Bin長寬…

【計算機網絡中的奈氏準則與香農定理】

文章目錄 一、前言二、奈氏準則1. 概念2. 奈氏準則公式3. 奈氏準則的意義 三、香農定理1. 概念2. 香農定理公式3. 香農定理的意義 四、奈氏準則與香農定理的對比五、應用示例1. 奈氏準則示例2. 香農定理示例 六、總結 一、前言 在計算機網絡中,數據的傳輸速率與信道…

【C++】回調函數和回調對象

文章目錄 回調可調用對象函數指針作回調函數對象作回調函數對象的使用std::function【C11】作回調使用 【C11】Lambda表達式作回調【C11】bind對象作回調std::bind的使用作回調使用 回調 當發生某種事件時需要調用或觸發另一個事件即為回調,回調的核心即為將可調用…

DeepSeek助力文案,智能音箱如何改變你的生活?

你好,我是三橋君 你有沒有為寫智能音箱的宣傳文案而抓耳撓腮過?三橋君在這方面可是有些感想,今天就來給你嘮嘮怎么用DeepSeek寫出超贊的智能音箱宣傳文案。 首先,你得給DeepSeek喂足“料”。這就好比做飯,你得準備好各…

【區塊鏈安全 | 第一篇】密碼學原理

文章目錄 1.哈希函數1.1 哈希函數的性質1.2 常見哈希算法1.3 Merkle Tree(默克爾樹)1.4 HMAC(哈希消息認證碼) 2. 公鑰密碼學2.1 對稱加密 vs 非對稱加密2.2 RSA 算法2.3 ECC(橢圓曲線密碼學)2.4 Diffie-He…

基于websocketpp實現的五子棋項目

該博客對于學完C和linux操作系統,但不知道如何用C開發項目,已經不知道C如何使用第三方庫的人來說一定很有幫助,請耐心看完! 先看一下游戲會顯示的前端界面,對理解這個游戲的前后端交互過程會有幫助 1. 開發環境 1.1 …

基于Redis分布鎖+事務補償解決數據不一致性問題

基于Redis的分布式設備庫存服務設計與實現 概述 本文介紹一個基于Redis實現的分布式設備庫存服務方案,通過分布式鎖、重試機制和事務補償等關鍵技術,保證在并發場景下庫存操作的原子性和一致性。該方案適用于物聯網設備管理、分布式資源調度等場景。 …

RK3568筆記八十: Linux 小智AI環境搭建

若該文為原創文章,轉載請注明原文出處。 最近小智AI火了,韋老師出了 Linux 小智 AI 聊天機器人 版本,想移植到 RK3568上, 由于和韋老師硬件不同,所以需要交叉編譯一些庫,為后續移植做準備。 一、環境 1、…

C# SerialPort 使用詳解

總目錄 前言 在工業控制、物聯網、嵌入式開發等領域,串口通信(Serial Port Communication)是連接串行設備(如條碼掃描器、GPS接收器等)與計算機的重要手段。C# 提供了內置的 SerialPort 類,簡化了串口開發…

3D點云的深度學習網絡分類(按照作用分類)

1. 3D目標檢測(Object Detection) 用于在點云中識別和定位目標,輸出3D邊界框(Bounding Box)。 🔹 方法類別: 單階段(Single-stage):直接預測3D目標位置&am…

LabVIEW 與 PLC 通訊的常見方式

在工業自動化和數據采集系統中,PLC(可編程邏輯控制器) 廣泛用于控制和監測各種設備,而 LabVIEW 作為強大的圖形化編程工具,常用于上位機數據處理和可視化。為了實現 LabVIEW 與 PLC 的高效通訊,常見的方法包…

2025 polarctf春季個人挑戰賽web方向wp

來個彈窗 先用最基礎的xss彈窗試一下 <script>alert("xss")</script>沒有內容&#xff0c;猜測過濾了script&#xff0c;雙寫繞過一下 <scrscriptipt>alert("xss")</scscriptript>background 查看網頁源代碼 查看一下js文件 類…

【Ai】--- 可視化 DeepSeek-r1 接入 Open WebUI(超詳細)

在編程的藝術世界里,代碼和靈感需要尋找到最佳的交融點,才能打造出令人為之驚嘆的作品。而在這座秋知葉i博客的殿堂里,我們將共同追尋這種完美結合,為未來的世界留下屬于我們的獨特印記。【Ai】--- 可視化 DeepSeek-r1 接入 Open WebUI(超詳細) 開發環境一、前情提要:你…

7.1-7.2考研408數據結構查找算法核心知識點深度解析

考研408數據結構查找算法核心知識點深度解析 一、查找基本概念 1.1 核心定義與易錯點 查找表與關鍵字 易錯點:混淆靜態查找表(僅查詢)與動態查找表(含插入/刪除操作)的應用場景。例如哈希表屬于動態查找結構,而分塊查找適用于靜態數據。難點:理解平均查找長度(ASL)的…

Redis--redis客戶端

目錄 一、引言 二、數據庫管理命令 三、redis客戶端 四、Java客戶端使用Redis 五、相關命令使用 1.get&#xff0c;set 2.exists&#xff0c;del 3.keys 4.expire&#xff0c;ttl 六、總結 一、引言 在之前學了redis相關類型命令之后&#xff0c;本篇文章&#xff0c;…

SpringBoot3.0不建議使用spring.factories,使用AutoConfiguration.imports新的自動配置方案

文章目錄 一、寫在前面二、使用imports文件1、使用2、示例比對3、完整示例 參考資料 一、寫在前面 spring.factories是一個位于META-INF/目錄下的配置文件&#xff0c;它基于Java的SPI(Service Provider Interface)機制的變種實現。 這個文件的主要功能是允許開發者聲明接口的…

鴻蒙特效教程10-卡片展開/收起效果

鴻蒙特效教程10-卡片展開/收起效果 在移動應用開發中&#xff0c;卡片是一種常見且實用的UI元素&#xff0c;能夠將信息以緊湊且易于理解的方式呈現給用戶。 本教程將詳細講解如何在HarmonyOS中實現卡片的展開/收起效果&#xff0c;通過這個實例&#xff0c;你將掌握ArkUI中狀…