代碼隨想錄算法訓練day64---圖論系列8《拓撲排序dijkstra(樸素版)》

代碼隨想錄算法訓練

—day64

文章目錄

  • 代碼隨想錄算法訓練
  • 前言
  • 一、53. 117. 軟件構建—拓撲排序
  • 二、47. 參加科學大會---dijkstra(樸素版)
  • 總結


前言

今天是算法營的第64天,希望自己能夠堅持下來!
今天繼續圖論part!今日任務:
● 拓撲排序
●dijkstra(樸素版)


一、53. 117. 軟件構建—拓撲排序

卡碼網題目鏈接
文章講解

給出一個 有向圖,把這個有向圖轉成線性的排序 就叫拓撲排序。
適合應用在例如B依賴A,C依賴B,要先有A才能有B,先有B才能有C的依賴關系找出先后順序的問題。

實現拓撲排序的算法有兩種:卡恩算法(BFS)和DFS,一般來說我們只需要掌握 BFS (廣度優先搜索)就可以了,清晰易懂。

思路:
在這里插入圖片描述
找 入度為 0 的節點,只有入度為0,它才是出發節點。
步驟:
1.找到入度為0 的節點,加入結果集
2.該節點指向的節點入度-1

代碼如下:

#include<iostream>
#include<vector>
#include<unordered_map>
#include<queue>
using namespace std;int main() {int n, m, s, t;cin >> n >> m;vector<int> inDegree(n, 0); //記錄每個文件的入度unordered_map<int, vector<int>> umap; //記錄文件的依賴 first指向多個second文件vector<int> result; //記錄結果while (m--) {//s->t 先有s才能有tcin >> s >> t;inDegree[t]++;umap[s].push_back(t); //記錄s指向哪些文件}//因為會有不只1個文件入度為0,用隊列存放入度為0的文件queue<int>que;for (int i = 0; i < n; i++) {if (inDegree[i] == 0) que.push(i);        }//循環從隊列中取出文件處理//1.將入度為0的文件加入結果集,2.刪掉入度為0的文件while (!que.empty()) {int cur = que.front();que.pop();result.push_back(cur);vector<int> files = umap[cur]; //獲取該文件指向的文件for (int j = 0; j < files.size(); j++) {inDegree[files[j]]--; //cur指向的文件入度-1if(inDegree[files[j]] == 0) que.push(files[j]); //新的入度為0的文件加入到隊列}}//打印結果if (result.size() == n) {for (int i = 0; i < n - 1; i++) cout << result[i] << " ";cout << result[n - 1]; //最后不包含空格,所以分開打印} else {cout << -1 << endl;}return 0;
}

二、47. 參加科學大會—dijkstra(樸素版)

卡碼網題目鏈接
文章講解

dijkstra算法:在有權圖(權值非負數)中求從起點到其他節點的最短路徑算法。
需要注意兩點:

  • dijkstra 算法可以同時求 起點到所有節點的最短路徑
  • 權值不能為負數

dijkstra和prim算法思路很像,只是dijkstra是求最短路徑,minDist數組 用來記錄 每一個節點距離源點的最小距離;而prim里的minDist數組是記錄每個節點到生成樹的最小距離

dijkstra三部曲:
第一步,選源點到哪個節點近且該節點未被訪問過
第二步,該最近節點被標記訪問過
第三步,更新非訪問節點到源點的距離(即更新minDist數組)

為了更好理解,數組下標從1開始,對應節點1,到達節點n對應下標n。
代碼如下:

#include<iostream>
#include<vector>
#include<climits>
using namespace std;int main() {int n, m, s, e, v;cin >> n >> m;vector<vector<int>> grid(n + 1, vector<int>(n + 1, INT_MAX));while (m--) {cin >> s >> e >> v;grid[s][e]= v;}int start = 1;int end = n;vector<int>minDist(n+1, INT_MAX); //記錄從原點到達每個節點的最短路徑vector<bool>visited(n+1, false);minDist[start] = 0;//遍歷所有節點for (int i = 1; i <= n; i++) { int minVal = INT_MAX;int cur = 1; //當前節點//遍歷minDist,找出距離原點最近且未訪問的節點for (int j = 1; j <= n; ++j) {if (!visited[j] && minDist[j] < minVal) {minVal = minDist[j];cur = j;}}//標記訪問過的節點visited[cur] = true;//更新minDist,這里是判斷原點到當前節點+當前節點到下一個節點的距離是否比原來的近for (int j = 1; j <= n; j++) {if (!visited[j] && grid[cur][j] != INT_MAX && minDist[cur] + grid[cur][j] < minDist[j]) {minDist[j] = minDist[cur] + grid[cur][j];}}}if (minDist[end] == INT_MAX) cout << -1 << endl; //不能到達終點else cout << minDist[end] << endl; //到達終點最短路徑return 0;
}

總結

  • 拓撲排序 :
    1.unordered_map<int, vector> umap,存放每個節點指向多個節點
    2.一個vectorinDegrees記錄每個節點的入度
    3.遍歷inDegrees,用隊列queue存放入度為0的節點
    4.遍歷queue,將入度為0指向的節點入度-1,并將新的入度為0的節點加入到隊列中。

  • dijkstra算法:
    1.vector<vector>grid存放節點間的權值, vectorminDist存放每個節點到源點的最小距離,vectorvisited記錄已經被訪問的節點
    2.遍歷每個節點,遍歷minDist,找到離源點最小距離且未訪問過的節點
    3.標記成已訪問的節點
    4.更新minDist數組

明天繼續加油!

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

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

相關文章

學術小助手智能體

學術小助手&#xff1a;開學季的學術領航員 文心智能體平臺AgentBuilder | 想象即現實 文心智能體平臺AgentBuilder&#xff0c;是百度推出的基于文心大模型的智能體平臺&#xff0c;支持廣大開發者根據自身行業領域、應用場景&#xff0c;選取不同類型的開發方式&#xff0c;…

JavaScript 簡單類型與復雜類型-復雜類型傳參

在JavaScript中&#xff0c;變量根據其存儲的數據類型可分為簡單類型&#xff08;基本數據類型&#xff09;和復雜類型&#xff08;引用數據類型&#xff09;。理解這兩者在函數調用時的行為差異對于編寫高效且無誤的代碼至關重要。本文將專注于探討復雜類型的參數傳遞機制&…

L2-043 龍龍送外賣(dfs)

龍龍是“飽了呀”外賣軟件的注冊騎手&#xff0c;負責送帕特小區的外賣。帕特小區的構造非常特別&#xff0c;都是雙向道路且沒有構成環 —— 你可以簡單地認為小區的路構成了一棵樹&#xff0c;根結點是外賣站&#xff0c;樹上的結點就是要送餐的地址。 每到中午 12 點&#…

如何基于PyTorch做二次開發

基于PyTorch進行二次開發以實現可視化工程&#xff0c;可以從以下幾個方面入手&#xff1a;模型結構可視化、訓練過程監控、特征可視化等。以下是一些推薦的GitHub項目&#xff0c;這些項目可以幫助你快速搭建一個可視化的工程環境&#xff1a; ### 1. **PyTorch CNN Visualiz…

本地大模型編程實戰(26)用langgraph實現基于SQL數據構建的問答系統(5)

本文將將擴展上一篇文章完成的 langgraph 鏈&#xff0c;繼續使用基于 langgraph 鏈 &#xff0c;對結構化數據庫 SQlite 進行查詢的方法。該系統建立以后&#xff0c;我們不需要掌握專業的 SQL 技能&#xff0c;可以用自然語言詢問有關數據庫中數據的問題并返回答案。主要完善…

【Kubernetes】污點和容忍

一、概述 在 Kubernetes&#xff08;k8s&#xff09;中&#xff0c;污點&#xff08;Taints&#xff09; 是定義在節點上的一種機制&#xff0c;用于拒絕某些 Pod 調度到該節點&#xff0c;除非這些 Pod 具有對應的容忍度&#xff08;Tolerations&#xff09;。污點可以用來控…

【大模型?知識圖譜】大模型結合醫療知識圖譜:解鎖智能輔助診療系統新范式

【大模型?知識圖譜】大模型結合醫療知識圖譜:解鎖智能輔助診療系統新范式 大模型結合醫療知識圖譜:解鎖智能輔助診療系統新范式引言一、系統架構1.1 系統架構圖1.2 架構模塊說明1.2.1 用戶輸入1.2.2 大模型(語義理解與意圖識別)1.2.3 Agent(問題解析與任務分配)1.2.4 問…

FASIONAD:自適應反饋的類人自動駕駛中快速和慢速思維融合系統

24年11月來自清華、早稻田大學、明尼蘇達大學、多倫多大學、廈門大學馬來西亞分校、電子科大&#xff08;成都&#xff09;、智平方科技和河南潤泰數字科技的論文“FASIONAD : FAst and Slow FusION Thinking Systems for Human-Like Autonomous Driving with Adaptive Feedbac…

【免費】YOLO[笑容]目標檢測全過程(yolo環境配置+labelimg數據集標注+目標檢測訓練測試)

一、yolo環境配置 這篇帖子是我試過的&#xff0c;非常全&#xff0c;很詳細【cudaanacondapytorchyolo(ultralytics)】 yolo環境配置 二、labelimg數據集標注 可以參考下面的帖子&#xff0c;不過可能會出現閃退的問題&#xff0c;安裝我的流程來吧 2.1 labelimg安裝 label…

Linux系統軟件管理

systemctl 控制軟件啟動和關閉 Linux系統很多軟件支持使用systemctl命令控制&#xff1a;啟動&#xff0c;停止&#xff0c;開啟自啟。 能被systemctl管理的軟件&#xff0c;一般被稱為&#xff1a;服務。 語法&#xff1a;systemctl start|stop|status|enable|disable 服務名…

CAN總線通信協議學習1——物理層

首先來看看CAN是怎么產生的&#xff1a;簡單理解&#xff0c;CAN就是一種“擁有特別連接方式”的數據傳輸的總線&#xff0c;其有特定的一些規則。 &#xff08;注&#xff1a;資料及圖片來源于知乎博主TOMOCAT。&#xff09; CAN總線的結構 查閱參考文獻&#xff0c;OSI標準…

偏移量是什么

在將二維網格映射到一維數組時&#xff0c;偏移量是指在一維數組中 某一行的第一個元素相對于數組起始位置的位置差。對于一個 3 行 4 列的網格&#xff0c;我們使用公式 cur_pos x * n y 來計算二維位置 (x, y) 在一維數組中的索引。 當 x 0 &#xff08;第一行&#xff…

【Mac電腦本地部署Deepseek-r1:詳細教程與Openwebui配置指南】

文章目錄 前言電腦配置&#xff1a;安裝的Deepseek版本&#xff1a;使用的UI框架&#xff1a;體驗效果展示&#xff1a;本地部署體驗總結 部署過程Ollama部署拉取模型運行模型Openwebui部署運行Ollama服務在Openwebui中配置ollama的服務 后話 前言 deepseek最近火的一塌糊涂&a…

給小白的oracle優化工具,了解一下

有時懶得分析或語句太長&#xff0c;可以嘗試用oracle的dbms_sqldiag包進行sql優化&#xff0c; --How To Use DBMS_SQLDIAG To Diagnose Query Performance Issues (Doc ID 1386802.1) --診斷SQL 性能 SET ECHO ON SET LINESIZE 132 SET PAGESIZE 999 SET LONG 999999 SET SER…

YOLO11改進加入ResNet網絡

文章目錄 1.改進目的2.demo引入2.1代碼2.2 結果展示2.3 BottleNeck詳解 1.改進目的 原始YOLO11模型訓練好以后&#xff0c;檢測結果mAP結果很低&#xff0c;視頻檢測結果很差&#xff0c;于是想到改進網絡&#xff0c;這里介紹改進主干網絡。 2.demo引入 2.1代碼 # File: 2…

Spring MVC流程

SpringMVC啟動流程 啟動流程父子容器請求處理MultipartFile 解析參數傳遞返回值處理HandlerInterceptor 啟動流程 啟動Tomcat解析web.xml創建DispatcherServlet調用DIspatcherServlet的init方法 4.1 創建Spring容器 4.2 發布ContextRefresheEvent 4.3 在OnRefreshed方法中觸發…

【大數據】ClickHouse常見的錯誤及解決方式

ClickHouse 是一款高性能的列式數據庫&#xff0c;但在使用過程中難免會遇到一些錯誤。本文將介紹一些 ClickHouse 常見的錯誤及其解決方式&#xff0c;幫助您更好地使用 ClickHouse。 1、錯誤&#xff1a;DB::Exception 錯誤信息 DB::Exception:Table engine Distributed d…

物理競賽中的線性代數

線性代數 1 行列式 1.1 n n n 階行列式 定義 1.1.1&#xff1a;稱以下的式子為一個 n n n 階行列式&#xff1a; ∣ A ∣ ∣ a 11 a 12 ? a 1 n a 21 a 22 ? a 2 n ? ? ? ? a n 1 a n 2 ? a n n ∣ \begin{vmatrix}\mathbf A\end{vmatrix} \begin{vmatrix} a_{11…

IP-----動態路由OSPF

這只是IP的其中一塊內容&#xff0c;IP還有更多內容可以查看IP專欄&#xff0c;前一章內容為GRE和MGRE &#xff0c;可通過以下路徑查看IP-------GRE和MGRE-CSDN博客,歡迎指正 注意&#xff01;&#xff01;&#xff01;本部分內容較多所以分成了兩部分在下一章 5.動態路由OS…

數字內容體驗未來趨勢:交互升級與用戶深耕

智能技術重塑內容交互 隨著數字內容體驗進入深度智能化階段&#xff0c;AI驅動的內容生成與智能推薦算法正在重構用戶與信息的交互范式。基于自然語言處理技術的內容創作工具&#xff0c;已實現從文本自動生成到多模態內容適配的跨越&#xff0c;企業能夠以分鐘級速度產出符合…