最短路徑-Dijkstra算法板子(java)

自己把Dijkstra的板子整理了一下,也方便自己后續做題,在此做個記錄。

Dijkstra基本上都會需要這些變量:

??????? dist[]:記錄各個節點到起始節點的最短權值

??????? path[]:記錄各個節點的上一個節點(用來聯系該節點到起始節點的路徑)

??????? start:源點序號

??????? end:結束頂點序號

????????weight[][]:存邊的權重

??????? visit[]:當前該頂點的最短路徑是否已求出,即訪沒訪問過

??????? shortPath[]:存儲每一次的最短路徑的長度

感覺這些變量到最后還是需要根據題意靈活的舍取吧。

然后簡單的解釋一下Dijkstra算法的具體思路,也方便后續理解代碼。

注意:???? 1.Dijkstra算法不適合帶負權圖。

??????????????? 2.計算單源最短路徑問題。

Dijkstra算法的本質其實是貪心,說的通俗易懂點就是以起始點(源點)為中心向外層擴展(bfs),知道擴展到終點為止。

具體的算法過程如下:

??????? 聲明一個數組dist[]來保存源點到各個頂點的最短距離,聲明一個保存已經找到了最短路徑的頂點的集合T。然后初始化的時候,源點u的路徑權重被賦值為0,即dist[u] = 0,如果這個頂點u存在能直接到達的邊(u,v),就把dist[v]設為weight[u][v],(其中weight[i][j]表示(i,j)這條邊的權重),同時把所有其他(u不能直接到達的)頂點的路徑長度設為無窮大。初始時,集合T只有頂點s。

??????? 然后,從dist[]中選擇最小值,這個最小值就是源點u到該值對應的頂點的最短路徑,并且把該點加入到T中,此時我們就完成了第一個頂點的添加,除去源點,我們要加n-1個頂點

??????? 接著,我們需要看看新加入的頂點是否可以到達其他頂點,并且還要看通過該頂點到達其他點的路徑長度是否比源點直接到達短,如果短的話,我們就替換這些頂點在dist中的值,也叫松弛操作。之后重復這一步就可以,直到T中包含了圖的所有頂點

但是正常做題的時候好像并不會單獨創建一個集合去存頂點,一般都是用boolean visit[]數組,標記一下就行吧。

下面是我找到的Dijkstra板子:

public class 迪杰斯特拉 {static int M = 1000; // 表示兩個節點之間沒有路public static void main(String[] args) {int[][] weight = {{0, M, 10, M, 30, 100},{M, 0, 5, M, M, M},{M, M, 0, 50, M, M},{M, M, M, 0, M, 10},{M, M, M, 20, 0, 60},{M, M, M, M, M, 0}};int start = 0;  // 表示從源點開始// 存儲每一次的最短路徑的長度int[] shortPath = Dijkstra(weight,start);for(int i = 0;i < shortPath.length;i ++) {// 說明start點到i點沒有最短路if (shortPath[i] == M) {continue;}System.out.println("從" + start+ "出發到" + i + "最短距離是:" + shortPath[i]);}}public static int[] Dijkstra(int [][]weight, int start) {int n = weight.length;  // 頂點個數int[] shortPath = new int[n];   // 保存start點到其他各點的最短路徑String[] path = new String[n];  // 存儲每一步,保存start到其他各點的字符串表示for(int i = 0;i < n;i ++) {path[i] = start + "->" + i;}boolean[] visit = new boolean[n];   // 標記當前該頂點的最短路徑是否已求出,1表示已求出// 進行初始化shortPath[start] = 0;visit[start] = true;for(int cnt = 1;cnt < n; cnt ++) {  // 加入其余n-1個節點int k = 0;  // 選出一個距離初始頂點最近的未被標記的點int min = Integer.MAX_VALUE;for(int i = 0;i < n;i ++) {// 表示該點未確定最短路徑,并且start到該點有直接連接if (!visit[i] && weight[start][i] < min) {min = weight[start][i];k = i;}}// 把剛剛新選出的頂點標記為以求出最短路徑,并且路徑長度為minvisit[k] = true;shortPath[k] = min;// 這個時候k作為中轉節點,來進一步判斷start到未訪問的其他頂點的距離for(int i = 0;i < n;i ++) {// 表示由start到頂點i有一條路是經過頂點k的,并且要比start直接到達頂點i的距離要短,然后就更新,也叫松弛操作if (!visit[i] && weight[start][k] + weight[k][i] < weight[start][i]) {weight[start][i] = weight[start][k] + weight[k][i];path[i] = path[k] + "->" + i;}}}for(int i = 0;i < n;i ++) {if (shortPath[i] == M) {continue;}System.out.println("從" + start + "出發到" + i + "的最短路徑:" + path[i]);}return shortPath;}
}

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

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

相關文章

PostgreSQL數據庫的array類型

PostgreSQL數據庫相比其它數據庫&#xff0c;有很多獨有的字段類型。 比如array類型&#xff0c;以下表的pay_by_quarter與schedule兩個字段便是array類型&#xff0c;即數組類型。 CREATE TABLE sal_emp (name text,pay_by_quarter integer[],schedule t…

centos的根目錄占了大量空間怎么辦

問題 當根目錄磁盤不夠時&#xff0c;就必須刪除無用的文件了 上面的&#xff0c;如果刪除/usr 或/var是可以釋放出系統盤的 定位占空間大的文件 經過命令&#xff0c;一層層查哪些是占磁盤的。 du -sh /* | sort -rh | head -n 10 最終排查&#xff0c;是有個系統日志占了20…

PostgreSQL存儲過程“多態“實現:同一方法名支持不同參數

引言 在傳統編程語言中&#xff0c;方法重載&#xff08;同一方法名不同參數&#xff09;是實現多態的重要手段。但當我們將目光轉向PostgreSQL數據庫時&#xff0c;是否也能在存儲過程&#xff08;函數&#xff09;中實現類似的功能&#xff1f;本文將深入探討PostgreSQL中如…

快速學會Linux的WEB服務

一.用戶常用關于WEB的信息 什么是WWW www是world wide web的縮寫&#xff0c;及萬維網&#xff0c;也就是全球信息廣播的意思 通常說的上網就是使用www來查詢用戶所需要的信息。 www可以結合文字、圖形、影像以及聲音等多媒體&#xff0c;超鏈接的方式將信息以Internet傳遞到世…

Windows玩游戲的時候,一按字符鍵就顯示桌面

最近打賽伯朋克 2077 的時候&#xff0c;不小心按錯鍵了&#xff0c;導致一按字符鍵就顯示桌面。如下&#xff1a; 一開始我以為是輸入法的問題&#xff08;相信打游戲的人都知道輸入法和奔跑鍵沖突的時候有多煩&#xff09;&#xff0c;但是后來解決半天發現并不是。在網上搜…

【測試開發】概念篇 - 從理解需求到認識常見開發、測試模型

&#x1f4e2;博客主頁&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客倉庫&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01; &…

核函數(Kernel function)

核函數 核函數在GPU上進行并行執行 注意: 限定詞__global__修飾 [雙下劃線]返回值必須是void 形式: _global_ void kernel_function( argument arg){ ? printf(“hello world from the GPU\n”); } void __global__kernel_function( argument arg){ ? printf(“hello worl…

數據結構與算法:區間dp

前言 區間dp也是動態規劃里很重要的一部分。 一、內容 區間dp的根本原理就是把大范圍問題分解成若干小范圍的問題去求解。一般來講,常見的用法有對于兩側端點去展開可能性和對于范圍上的劃分點去展開可能性。 二、題目 1.讓字符串成為回文串的最少插入次數 class Soluti…

AI Agent 入門指南:從 LLM 到智能體

AI. AI. AI. 最近耳朵里是不是總是被這些詞轟炸&#xff1f;特別是“Agent”、“AI Agent”、“智能體”、“Agentic”…… 感覺一夜之間&#xff0c;AI 就從我們熟悉的聊天框里蹦出來&#xff0c;要擁有“獨立思考”和“自主行動”的能力了&#xff1f; 說實話&#xff0c;一…

開啟docker中mysql的binlog日志

1.登陸docker服務器,輸入docker ps查看服務: 2.進入mysql服務 進入到mysql的服務容器后,輸入mysql -u*** -p***登陸 mysql 客戶端查看是否開啟binlog 輸入 : show variables like log_bin; 3.輸入quit退出mysql客戶端 4.之后在docker的mysql服務容器里查詢mysql的配置文件所在…

Kotlin 中 List 和 MutableList 的區別

在 Kotlin 中&#xff0c;List 和 MutableList 是兩種不同的集合接口&#xff0c;核心區別在于可變性。 Kotlin 集合框架的重要設計原則&#xff1a;通過接口分離只讀&#xff08;read - only&#xff09;和可變&#xff08;mutable&#xff09;操作&#xff0c;以提高代碼的安…

【能力比對】K8S數據平臺VS數據平臺

&#x1f525;&#x1f525; AllData大數據產品是可定義數據中臺&#xff0c;以數據平臺為底座&#xff0c;以數據中臺為橋梁&#xff0c;以機器學習平臺為中層框架&#xff0c;以大模型應用為上游產品&#xff0c;提供全鏈路數字化解決方案。 ?AllData數據中臺官方平臺&…

Fastjson 從多層級的JSON數據中獲取特定字段的值

使用 Fastjson 的 JSONPath.eval 可以通過 JSONPath 表達式直接定位多層級 JSON 中的目標字段&#xff0c;避免逐層調用 getJSONObject() 的繁瑣操作。以下是具體實現方法和示例&#xff1a; 核心思路 通過 JSONPath.eval 方法&#xff0c;傳入 JSON 對象&#xff08;或 JSON…

端口安全基本配置

1.top圖 2.交換機配置 交換機swa <SWA> system-view [SWA] vlan batch 10 20[SWA] interface GigabitEthernet0/0/1 [SWA-GigabitEthernet0/0/1] port link-type trunk [SWA-GigabitEthernet0/0/1] port trunk allow-pass vlan 10[SWA] interface GigabitEthernet0/0/2 …

hadoop集群建立

建立Hadoop集群的步驟指南 建立Hadoop集群需要系統規劃和多個步驟的配置。以下是詳細的建立流程&#xff1a; 一、前期準備 硬件需求 多臺服務器(至少3臺&#xff0c;1主2從) 每臺建議配置&#xff1a;至少4核CPU&#xff0c;8GB內存&#xff0c;100GB硬盤 穩定的網絡連接(…

從零開始學java--集合類(2)

集合類 目錄 集合類 Queue 隊列的使用&#xff1a; 雙端隊列&#xff08;Deque&#xff09; Map和Set 概念&#xff1a; 模型&#xff1a; Map 常見方法說明&#xff1a; 注意&#xff1a; TreeMap和HashMap的區別&#xff1a; Set 常見方法說明&#xff1a; 注…

【HarmonyOS 5】鴻蒙發展歷程

【HarmonyOS 5】鴻蒙發展歷程 一、鴻蒙 HarmonyOS 版本年代記 鴻蒙 1.0&#xff1a; 2019 年 8 月 9 日&#xff0c;華為在開發者大會上正式發布鴻蒙 1.0 系統&#xff0c;這一版本首次應用于華為榮耀智慧屏產品中&#xff0c;標志著華為正式進軍操作系統領域。該版本初步展現…

SpringBoot教學管理平臺源碼設計開發

概述 基于SpringBoot框架開發的??教學管理平臺??完整項目&#xff0c;幫助開發者快速搭建在線教育平臺。該系統包含學生端、教師端和管理后臺&#xff0c;實現了課程管理、隨堂測試、作業提交等核心功能&#xff0c;是學習SpringBoot開發的優質案例。 主要內容 1. 系統架…

人工智能端側熱度再起

在科技浪潮洶涌澎湃的當下,人工智能端側正悄然掀起新一輪的熱度風暴。曾經,人工智能更多停留在概念層面,仿佛是遙不可及的未來幻想;而后,它逐漸落地,在特定領域嶄露頭角,卻也顯得有些曲高和寡。但如今,人工智能端側正以前所未有的態勢融入我們的生活,從智能手機的語音…

相同的數(簡單)

深度優先搜索 如果兩個二叉樹都為空&#xff0c;則兩個二叉樹相同。如果兩個二叉樹中有且只有一個為空&#xff0c;則兩個二叉樹一定不相同。 如果兩個二叉樹都不為空&#xff0c;那么首先判斷它們的根節點的值是否相同&#xff0c;若不相同則兩個二叉樹一定不同&#xff0c;…