算法與數據結構--最短路徑Dijkstra算法

題目:

算法與數據結構實驗題 10.20 迷路

★實驗任務

學長經常迷路,現在他又遇到問題了,需要求救。

假設他有一張地圖,上面有N個點,M條路,他現在在編號為S的地方,想要去編號為E的地方,請你找到最短路徑的長度。

好消息是,每條路的長度都是1。

★數據輸入

輸入第一行包括四個整數N,M,S,E。表示有N個地點,M條道路,CYP當前所在的地點編號為S,要去的地點編號為E。

接下來M行每行兩個整數u,v表示地點u到地點v之間有路可以走。

★數據輸出

輸出一個整數表示最短的路線距離。

輸入示例

5 4 1 5
1 2
2 3
3 4
4 5

輸出示例

4

★提示

題中的圖為無向圖。

地點編號為1~N。

30% 1<=N<=10,1<=M<=20。

100% 1<=N<=100,1<=M<=5000。

100% 1<=u,v<=N。

教程

程序員必會,單源最短路徑,迪杰斯特拉算法,看動畫就全明白了_嗶哩嗶哩_bilibili

答案

代碼寫的很爛。。。

#include <iostream>
#include <limits>
#include <vector>
const int INF = 0x3f3f3f3f;//最大值 
using namespace std;
// 思路總結:選擇一個點作為起始點,
// 先將這個點作為中間結點,根據它直接連接的邊作為更新數據,更新從頂點到其他頂點的距離
// 尋找與起始距離最近且沒有作為中間結點的結點,以該結點作為中間節點,重復步驟2,
// 注意更新的時候注意連接的其他節點未被標記且更新后的路徑更短 
// 直到全部頂點都作為了中間節點, 并且完成路徑更新,算法就結束了
vector<int> Dijkstra(vector<vector<int>>& graph, int start) {int n = graph.size();     // 存儲圖中的頂點個數vector<int> visit(n, 0);  // 標記已作為中間節點完成訪問的頂點vector<int> dist(n, INF);   // 存儲從起點start到其他頂點的最短路徑for (int i = 0; i < n; i++) {dist[i] = graph[start][i];  // 將dis數組初始化為圖中的路徑長度。}visit[start] = 1;  // 標記起始頂點// 每次添加一個點為中間節點,添加n-1次for (int i = 1; i <= n - 1; i++) {// 在dist里尋找與起始距離最近且沒有被訪問過的頂點,作為中間節點int min = INF;int midIndex = 0;for (int j = 0; j < n; j++) {if (min > dist[j] && visit[j] == 0 &&j!=start) {min = dist[j];minIndex = j;}}visit[midIndex] = 1;// 根據這個點所連接的邊來更新數據,更新起點到其他頂點的距離,也就是更新dist數組// 先記錄下起點到這個點的距離,以便后序更新int distantToMid = dist[midIndex];// 開始根據graph更新dist數組 for (int j = 0; j < n; j++) {int newDist= distantToMid + graph[minIndex][j];//注意更新的時候該結點未被標記為中間節點,且更新后的值要小于更新前的值 if(graph[minIndex][j]!=INF&&visit[j]!=1&&(newDist<dist[j]))dist[j] = newDist;}}return dist;
}
int main() {int n, m, s, e;cin >> n >> m >> s >> e;vector<vector<int>> graph(n, vector<int>(n));// 都先初始化為無窮大for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {graph[i][j] = INF;}}// 輸入各點的距離,創建鄰接矩陣 for (int i = 0; i < m; i++) {int u, v;cin >> u >> v;graph[u-1][v-1] = 1;graph[v-1][u-1]=1;}// 調用迪杰斯特拉算法vector<int> dist=Dijkstra(graph, s-1);cout << dist[e-1];
}

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

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

相關文章

Linux中的幾個重要指令

關於 Process 處理的指令 1. ps ps 是用來顯示目前你的 process 或系統 processes 的狀況。 以下列出比較常用的參數: 其選項說明如下: -a 列出包括其他 users 的 process 狀況。 -u 顯示 user - oriented 的 process 狀況 。 -x 顯示包括沒有 terminal 控制的 process 狀…

程序員養生指南。。。

【關注微信公眾號&#xff1a;跟強哥學SQL&#xff0c;回復“筆試”免費領取大廠SQL筆試題。】 作為一個程序員&#xff0c;確實需要特別關注健康問題。長時間的熬夜加班、久坐不動等工作習慣可能會導致身體亞健康狀態。以下是一些養生延壽的建議&#xff1a; 1. 定期運動&…

數據結構:第13關:查找兩個單詞鏈表共同后綴的起始結點

任務描述編程要求 輸入輸出測試說明來源 任務描述 本關任務&#xff1a;假定采用帶頭結點的單鏈表保存單詞&#xff0c;當兩個單詞有相同的后綴時&#xff0c;則可共享相同的后綴空間。 例如&#xff0c;“loading”和“being”的存儲映像如下圖所示&#xff1a; 設str1和str2…

離線環境下安裝python庫(推薦pip download)

離線環境下安裝python庫&#xff08;推薦pip download&#xff09; 目錄 1.需求 2.失敗操作&#xff08;注意&#xff09; 3.成功操作 4.其它參考 1.需求 機器部署web系統環境后&#xff0c;就不可再次聯網&#xff0c;所以升級python web后端&#xff0c;需要離線安裝pyt…

【LLM】大模型之RLHF和替代方法(DPO、RAILF、ReST等)

note SFT使用交叉熵損失函數&#xff0c;目標是調整參數使模型輸出與標準答案一致&#xff0c;不能從整體把控output質量&#xff0c;RLHF&#xff08;分為獎勵模型訓練、近端策略優化兩個步驟&#xff09;則是將output作為一個整體考慮&#xff0c;優化目標是使模型生成高質量…

火山引擎邊緣計算用硬核助力賽事直播

經過一個多月激烈爭奪&#xff0c;2023英雄聯盟全球總決賽終于在11月19日落下帷幕。精彩的對決和高熱話題使得直播平臺觀賽人數暴增&#xff0c;給直播平臺穩定性和資源儲備提出了巨大的考驗。

推薦3dmax常用15款插件,快來了解一下吧!

推薦3dmax常用15款插件&#xff0c;快來了解一下吧&#xff01; 插件是3ds MAX軟件的重要組成部分&#xff0c;提供了太多便利&#xff0c;也提升了建模、渲染和動畫的效率&#xff0c;下面就給大家推薦25款常用的3dMax插件。 1&#xff09;DashedShape DashedShape實線轉虛線…

CentOS修改SSH端口號和禁止root用戶直接登錄

原文在 https://cloud.tencent.com/developer/article/1124500 1、使用vi編輯器打開ssh配置文件 /etc/ssh/sshd_config Port 22 #在第三行或第四行&#xff0c;如果前面有井號&#xff0c;請刪除&#xff0c;修改為65534以下即可 2、更加安全的設置&#xff0c;禁止ROOT登陸…

3c分支語句和循環語句(非重點)

文章目錄 1. 什么是語句&#xff1f;2. 分支語句&#xff08;選擇結構&#xff09;2.1 if語句2.1.1 懸空else2.1.2 if書寫形式的對比 2.2 switch語句2.2.1 在switch語句中的 break2.2.2 default子句 3. 循環語句3.1 while循環3.1.1 while語句中的break和continue3.2 for循環3.2…

C++(17):invoke_result聲明函數的返回值類型

通常的C++程序,函數的返回值是確定的類型,那么為什么需要通過invoke_result來聲明函數的返回值類型呢? 用一個簡單但不一定實際的例子進行說明: #include <iostream> using namespace std;int funcAdd(int a, int b) {return a + b; }int wrapFuncAdd(int a, int b…

研表究明,文字的序順并不定一能響影GPT-4讀閱

深度學習自然語言處理 原創作者&#xff1a;yy 很多年前&#xff0c;你一定在互聯網上看過這張圖&#xff0c;展示了人腦能夠閱讀和理解打亂順序的單詞和句子&#xff01;而最近東京大學的研究發現&#xff0c;大語言模型&#xff08;LLMs&#xff09; 尤其是 GPT-4&#xff0c…

對象與對象數組

對象與對象數組 實驗介紹 本章節主要介紹對象數組和對象成員。在實際的開發中&#xff0c;對象數組和對象成員是經常使用的&#xff0c;所以首先需要學習對象數組與對象成員的各種使用方法。 提示&#xff1a;為了方便課程講解&#xff0c;示例代碼使用類內定義的方式實現&a…

19 redis緩存數據同步問題

1、緩存穿透 指緩存和數據庫中都沒有的數據&#xff0c;而用戶不斷發起請求。由于緩存不命中&#xff0c;并且出于容錯考慮&#xff0c;如果從存儲層查不到數據則不寫入緩存&#xff0c;這將導致這個不存在的數據每次請求都要到存儲層去查詢&#xff0c;緩存就沒有意義了。 在…

掌控安全 -- header注入

http header注入 該注入是指利用后端驗證客戶端口信息&#xff08;比如常用的cookie驗證&#xff09;或者通過http header中獲取客戶端的一些信息&#xff08;比如useragent用戶代理等其他http header字段信息&#xff09;&#xff0c;因為這些信息是會重新返回拼接到后臺中的&…

JAVA定時任務技術總結

在日常的項目開發中&#xff0c;多多少少都會涉及到一些定時任務的需求。例如每分鐘掃描超時支付的訂單&#xff0c;每小時清理一次數據庫歷史數據&#xff0c;每天統計前一天的數據并生成報表&#xff0c;定時去掃描某個表的異常信息&#xff08;最終一致性的方案也可能涉及&a…

java面試題-描述下Object中常用的方法

遠離八股文&#xff0c;面試大白話&#xff0c;通俗且易懂 看完后試著用自己的話復述出來。有問題請指出&#xff0c;有需要幫助理解的或者遇到的真實面試題不知道怎么總結的也請評論中寫出來&#xff0c;大家一起解決。 java面試題匯總-目錄-持續更新中 這個沒辦法&#xff0c…

31、卷積 - 參數 dilation 以及空洞卷積

在卷積算法中,還有一個不常見的參數叫做dilation(中文:膨脹)。 很多同學可能沒聽說過這個參數,下面看看這個參數有什么作用,用來控制什么的。 我們還是放這個經典的卷積運算圖,圖中是看不出 dilation 這個參數的存在的。 如果再換一張圖呢,發現兩圖的區別了嗎? 沒錯…

怎么去評估數據資產?一個典型的政務數據資產評估案例

據中國資產評估協會《數據資產評估指導意見》&#xff0c;數據資產評估主要是三個方法&#xff1a;市場法、成本法和收益法。之前小億和大家分享了數據資產評估方法以及價值發揮的路徑&#xff0c;今天結合一個案例來具體講解一下怎么去評估數據資產。 這個案例是一個典型的一個…

tmux常見會話管理命令

tmux常見會話管理命令 新建會話 tmux new -s <session-name> 查看會話 會話內外都可以用tmux ls或者tmux list-session 分離會話 如果命令行可以輸入命令&#xff0c;則可以選擇輸入命令tmux detach 如果命令行沒法輸入命令&#xff0c;可以按下commandb以后按d …

SAM+使用SAM應用數據集完成分割

什么是SAM&#xff1f; SAM(Segment Anything Model&#xff09;是由 Meta 的研究人員團隊創建和訓練的深度學習模型。在 Segment everything 研究論文中&#xff0c;SAM 被稱為“基礎模型”。 基礎模型是在大量數據上訓練的機器學習模型&#xff08;通常通過自監督或半監督學習…