代碼隨想錄學習 54day 圖論 from代碼隨想錄

圖論總結篇

從深搜廣搜 到并查集,從最小生成樹到拓撲排序, 最后是最短路算法系列。至此算上本篇,一共30篇文章,圖論之旅就在此收官了。在0098.所有可達路徑 ,我們接觸了兩種圖的存儲方式,鄰接表和鄰接矩陣,掌握兩種圖的存儲方式很重要。圖的存儲方式也是大家習慣在核心代碼模式下刷題 經常忽略的 知識點。因為在力扣上刷題不需要掌握圖的存儲方式。

深搜與廣搜

在二叉樹章節中,其實我們講過了 深搜和廣搜在二叉樹上的搜索過程。在圖論章節中,深搜與廣搜就是在圖這個數據結構上的搜索過程。深搜與廣搜是圖論里基本的搜索方法,大家需要掌握三點:搜索方式:深搜是可一個方向搜,不到黃河不回頭。 廣搜是圍繞這起點一圈一圈的去搜。代碼模板:需要熟練掌握深搜和廣搜的基本寫法。應用場景:圖論題目基本上可以即用深搜也可用廣搜,無疑是用哪個方便而已

注意事項

需要注意的是,同樣是深搜模板題,會有兩種寫法。在0099.島嶼的數量深搜.md 和 0105.有向圖的完全可達性,涉及到dfs的兩種寫法。我們對dfs函數的定義是 是處理當前節點 還是處理下一個節點 很重要,決定了兩種dfs的寫法。這也是為什么很多錄友看到不同的dfs寫法,結果發現提交都能過的原因。而深搜還有細節,有的深搜題目需要用到回溯的過程,有的就不用回溯的過程,一般是需要計算路徑的問題 需要回溯,如果只是染色問題(島嶼問題系列) 就不需要回溯。例如: 0105.有向圖的完全可達性 深搜就不需要回溯,而 0098.所有可達路徑 中的遞歸就需要回溯,文章中都有詳細講解注意:以上說的是不需要回溯,不是沒有回溯,只要有遞歸就會有回溯,只是我們是否需要用到回溯這個過程,這是需要考慮的。很多錄友寫出來的廣搜可能超時了, 例如題目:0099.島嶼的數量廣搜根本原因是只要 加入隊列就代表 走過,就需要標記,而不是從隊列拿出來的時候再去標記走過。具體原因,我在0099.島嶼的數量廣搜 中詳細講了。在深搜與廣搜的講解中,為了防止慣性思維,我特別加入了題目 0106.島嶼的周長,提醒大家,看到類似的題目,也不要上來就想著深搜和廣搜。還有一些圖的問題,在題目描述中,是沒有圖的,需要我們自己構建一個圖,例如 0110.字符串接龍,題目中連線都沒有,需要我們自己去思考 什么樣的兩個字符串可以連成線。

并查集

并查集相對來說是比較復雜的數據結構,其實他的代碼不長,但想徹底學透并查集,需要從多個維度入手,我在理論基礎篇的時候 講解如下重點:為什么要用并查集,怎么不用個二維數據,或者setmap之類的。
并查集能解決那些問題,哪些場景會用到并查集
并查集原理以及代碼實現
并查集寫法的常見誤區
帶大家去模擬一遍并查集的過程
路徑壓縮的過程
時間復雜度分析
上面這幾個維度 大家都去思考了,并查集基本就學明白了。其實理論基礎篇就算是給大家出了一道裸的并查集題目了,所以在后面的題目安排中,會稍稍的拔高一些,重點在于并查集的應用上。例如 并查集可以判斷這個圖是否是樹,因為樹的話,只有一個根,符合并查集判斷集合的邏輯,題目:0108.冗余連接。在0109.冗余連接II 中 對有向樹的判斷難度更大一些,需要考慮的情況比較多。

最小生成樹

最小生成樹是所有節點的最小連通子圖, 即:以最小的成本(邊的權值)將圖中所有節點鏈接到一起。最小生成樹算法,有prim 和 kruskal。prim 算法是維護節點的集合,而 Kruskal 是維護邊的集合。在 稀疏圖中,用Kruskal更優。 在稠密圖中,用prim算法更優。邊數量較少為稀疏圖,接近或等于完全圖(所有節點皆相連)為稠密圖Prim 算法 時間復雜度為 O(n^2),其中 n 為節點數量,它的運行效率和圖中邊樹無關,適用稠密圖。Kruskal算法 時間復雜度 為 O(nlogn),其中n 為邊的數量,適用稀疏圖。關于 prim算法,我自創了三部曲,來幫助大家理解:第一步,選距離生成樹最近節點第二步,最近節點加入生成樹第三步,更新非生成樹節點到生成樹的距離(即更新minDist數組)大家只要理解這三部曲, prim算法 至少是可以寫出一個框架出來,然后在慢慢補充細節,這樣不至于 自己在寫prim的時候 兩眼一抹黑 完全憑感覺去寫。minDist數組 是prim算法的靈魂,它幫助 prim算法完成最重要的一步,就是如何找到 距離最小生成樹最近的點。kruscal的主要思路:邊的權值排序,因為要優先選最小的邊加入到生成樹里
遍歷排序后的邊
如果邊首尾的兩個節點在同一個集合,說明如果連上這條邊圖中會出現環
如果邊首尾的兩個節點不在同一個集合,加入到最小生成樹,并把兩個節點加入同一個集合
而判斷節點是否在一個集合 以及將兩個節點放入同一個集合,正是并查集的擅長所在。所以 Kruskal 是需要用到并查集的。這也是我在代碼隨想錄圖論編排上 為什么要先 講解 并查集 在講解 最小生成樹。

拓撲排序

拓撲排序 是在圖上的一種排序。概括來說,給出一個 有向圖,把這個有向圖轉成線性的排序 就叫拓撲排序。同樣,拓撲排序也可以檢測這個有向圖 是否有環,即存在循環依賴的情況。拓撲排序的一些應用場景,例如:大學排課,文件下載依賴 等等。只要記住如下兩步拓撲排序的過程,代碼就容易寫了:找到入度為0 的節點,加入結果集將該節點從圖中移除## 最短路算法```py
至此已經講解了四大最短路算法,分別是Dijkstra、Bellman_ford、SPFA 和 Floyd。針對這四大最短路算法,我用了七篇長文才徹底講清楚,分別是:dijkstra樸素版dijkstra堆優化版Bellman_fordBellman_ford 隊列優化算法(又名SPFA)bellman_ford 算法判斷負權回路bellman_ford之單源有限最短路Floyd 算法精講啟發式搜索:A * 算法最短路算法比較復雜,而且各自有各自的應用場景,我來用一張表把講過的最短路算法的使用場景都展現出來:(因為A * 屬于啟發式搜索,和上面最短路算法并不是一類,不適合一起對比,所以沒有放在一起)可能有同學感覺:這個表太復雜了,我記也記不住。其實記不住的原因還是對 這幾個最短路算法沒有深刻的理解。這里我給大家一個大體使用場景的分析:如果遇到單源且邊為正數,直接Dijkstra。至于 使用樸素版還是 堆優化版 還是取決于圖的稠密度, 多少節點多少邊算是稠密圖,多少算是稀疏圖,這個沒有量化,如果想量化只能寫出兩個版本然后做實驗去測試,不同的判題機得出的結果還不太一樣。一般情況下,可以直接用堆優化版本。如果遇到單源邊可為負數,直接 Bellman-Ford,同樣 SPFA 還是 Bellman-Ford 取決于圖的稠密度。一般情況下,直接用 SPFA。如果有負權回路,優先 Bellman-Ford, 如果是有限節點最短路 也優先 Bellman-Ford,理由是寫代碼比較方便。如果是遇到多源點求最短路,直接 Floyd。除非 源點特別少,且邊都是正數,那可以 多次 Dijkstra 求出最短路徑,但這種情況很少,一般出現多個源點了,就是想讓你用 Floyd 了。對于A * ,由于其高效性,所以在實際工程應用中使用最為廣泛 ,由于其 結果的不唯一性,也就是可能是次短路的特性,一般不適合作為算法題。游戲開發、地圖導航、數據包路由等都廣泛使用 A * 算法。

最短路算法是圖論中,比較復雜的算法,而且不同的最短路算法都有不同的應用場景。

我在 最短路算法總結篇 里已經做了一個高度的概括。

大家要時常溫故而知新,才能透徹理解各個最短路算法。

## 總結
```py
到最后,圖論終于劇終了,相信這是市面上大家能看到最全最細致的圖論講解教程。圖論也是我 《代碼隨想錄》所有章節里 所費精力最大的一個章節。只為了不負錄友們的期待。 大家加油

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

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

相關文章

B樹(B-Tree)數據結構

1. 什么是B樹? B樹(B-Tree)是一種多路搜索樹,用于存儲和檢索大量數據。它是自適應的,適用于各種存儲設備和各種數據量。B樹的特點是高效的搜索、插入和刪除操作,且可以在各種情況下保持樹的平衡。 2. B樹…

昇思25天學習打卡營第16天 | Vision Transformer圖像分類

昇思25天學習打卡營第16天 | Vision Transformer圖像分類 文章目錄 昇思25天學習打卡營第16天 | Vision Transformer圖像分類Vision Transform(ViT)模型TransformerAttention模塊Encoder模塊 ViT模型輸入 模型構建Multi-Head Attention模塊Encoder模塊Pa…

工業三防平板助力工廠生產數據實時管理

在當今高度數字化和智能化的工業生產環境中,工業三防平板正逐漸成為工廠實現生產數據實時管理的得力助手。這種創新的技術設備不僅能夠在惡劣的工業環境中穩定運行,還為工廠的生產流程優化、效率提升和質量控制帶來了前所未有的機遇。 工業生產場景通常充…

機器學習——數據預處理和特征工程(sklearn)

目錄 一、數據挖掘流程 1. 獲取數據 2. 數據預處理 3. 特征工程 4. 建模,測試模型并預測出結果 5. 驗證模型效果 二、sklearn中的相關包 1.sklearn.preprocessing 2.sklearn.Impute 3.sklearn.feature_selection 4.sklearn.decomposition 三、數據預處理…

【網絡安全】PostMessage:分析JS實現XSS

未經許可,不得轉載。 文章目錄 前言示例正文 前言 PostMessage是一個用于在網頁間安全地發送消息的瀏覽器 API。它允許不同的窗口(例如,來自同一域名下的不同頁面或者不同域名下的跨域頁面)進行通信,而無需通過服務器…

【Arduino IDE】安裝及開發環境、ESP32庫

一、Arduino IDE下載 二、Arduino IDE安裝 三、ESP32庫 四、Arduino-ESP32庫配置 五、新建ESP32-S3N15R8工程文件 樂鑫官網 Arduino官方下載地址 Arduino官方社區 Arduino中文社區 一、Arduino IDE下載 ESP-IDF、MicroPython和Arduino是三種不同的開發框架,各自適…

定制開發AI智能名片商城微信小程序在私域流量池構建中的應用與策略

摘要 在數字經濟蓬勃發展的今天,私域流量已成為企業競爭的新戰場。定制開發AI智能名片商城微信小程序,作為私域流量池構建的創新工具,正以其獨特的優勢助力企業實現用戶資源的深度挖掘與高效轉化。本文深入探討了定制開發AI智能名片商城微信…

.NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 簡介及區別

簡述 在軟件開發的宇宙中,.NET是一個不斷擴展的星系,每個版本都像是一顆獨特的星球,擁有自己的特性和環境。作為技術經理,站在選擇的十字路口,您需要一張詳盡的星圖來導航。本文將作為您的向導,帶您穿越從.…

AIoTedge智能物聯網邊緣計算平臺:引領未來智能邊緣技術

引言 隨著物聯網技術的飛速發展,我們正步入一個萬物互聯的時代。AIoTedge智能物聯網邊緣計算平臺,以其創新的邊云協同架構,為智能設備和系統提供了強大的數據處理和智能決策能力,開啟了智能物聯網的新篇章。 智能邊緣計算平臺的核…

LLaMA-Factory

文章目錄 一、關于 LLaMA-Factory項目特色性能指標 二、如何使用1、安裝 LLaMA Factory2、數據準備3、快速開始4、LLaMA Board 可視化微調5、構建 DockerCUDA 用戶:昇騰 NPU 用戶:不使用 Docker Compose 構建CUDA 用戶:昇騰 NPU 用戶&#xf…

【Java項目筆記】01項目介紹

一、技術框架 1.后端服務 Spring Boot為主體框架 Spring MVC為Web框架 MyBatis、MyBatis Plus為持久層框架,負責數據庫的讀寫 阿里云短信服務 2.存儲服務 MySql redis緩存數據 MinIO為對象存儲,存儲非結構化數據(圖片、視頻、音頻&a…

推薦一款處理TCP數據的架構--EasyTcp4Net

EasyTcp4Net是一個基于c# Pipe,ReadonlySequence的高性能Tcp通信庫,旨在提供穩定,高效,可靠的tcp通訊服務。 基礎的消息通訊 重試機制 超時機制 SSL加密通信支持 KeepAlive 流量背壓控制 粘包和斷包處理 (支持固定頭處理,固定長度處理,固定字符處理) 日志支持Pipe &…

Spring MVC 的常用注解

RequestMapping 和 RestController注解 上面兩個注解,是Spring MCV最常用的注解。 RequestMapping , 他是用來注冊接口的路由映射。 路由映射:當一個用戶訪問url時,將用戶的請求對應到某個方法或類的過程叫做路由映射。 Reques…

定制QCustomPlot 帶有ListView的QCustomPlot 全網唯一份

定制QCustomPlot 帶有ListView的QCustomPlot 文章目錄 定制QCustomPlot 帶有ListView的QCustomPlot摘要需求描述實現關鍵字: Qt、 QCustomPlot、 魔改、 定制、 控件 摘要 先上效果,是你想要的,再看下面的分解,順便點贊搜藏一下;不是直接右上角。 QCustomPlot是一款…

基于springboot+vue+uniapp的駕校預約平臺小程序

開發語言:Java框架:springbootuniappJDK版本:JDK1.8服務器:tomcat7數據庫:mysql 5.7(一定要5.7版本)數據庫工具:Navicat11開發軟件:eclipse/myeclipse/ideaMaven包&#…

認識AOP--小白可看

AOP(Aspect-Oriented Programming,面向切面編程)是一種軟件開發范式,旨在通過橫切關注點(cross-cutting concerns)的方式來解耦系統中的各個模塊。橫切關注點指的是那些不屬于業務邏輯本身,但是…

Apache Sqoop

Apache Sqoop是一個開源工具,用于在Apache Hadoop和關系型數據庫(如MySQL、Oracle、PostgreSQL等)之間進行數據的批量傳輸。其主要功能包括: 1. 數據導入:從關系型數據庫(如MySQL、Oracle等)中將…

WPF設置歡迎屏幕,程序啟動過度動畫

當主窗體加載時間過長,這時候基本都會想添加一個等待操作來響應用戶點擊,提高用戶體驗。下面我記錄兩個方法,一點拙見,僅供參考。 方法1:在App類中使用SplashScreen類。 protected override void OnStartup(StartupEventArgs e)…

35.UART(通用異步收發傳輸器)-RS232(2)

(1)RS232接收模塊visio框圖: (2)接收模塊Verilog代碼編寫: /* 常見波特率: 4800、9600、14400、115200 在系統時鐘為50MHz時,對應計數為: (1/4800) * 10^9 /20 -1 10416 …

【作業】 貪心算法1

Tips:三題尚未完成。 #include <iostream> #include <algorithm> using namespace std; int a[110]; int main(){int n,r,sum0;cin>>n>>r;for(int i0;i<n;i){cin>>a[i];}sort(a0,an);for(int i0;i<n;i){if(i>r){a[i]a[i-r]a[i];}suma[…