日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

漫画:图的 “多源” 最短路径

發布時間:2024/9/27 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 漫画:图的 “多源” 最短路径 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

戳藍字“CSDN云計算”關注我們哦!

技術頭條:干貨、簡潔、多維全面。更多云計算精華知識盡在眼前,get要點、solve難題,統統不在話下!




—————? 第二天? —————








小灰的思路如下:


第一步,利用迪杰斯特拉算法的距離表,求出從頂點A出發,到其他各個頂點的最短距離:




第二步,繼續使用迪杰斯特拉算法,求出從頂點B出發,到其他各個頂點的最短距離。

第三步,從頂點C出發,到各個頂點的最短距離。

第四步,從頂點D出發......

.......

就像這樣,一直遍歷到頂點G。


這個思路的時間復雜度是多少呢?

假如圖中有n個頂點,如果不考慮堆優化,一次迪杰斯特拉算法的時間復雜度是O(n^2)。所以,把每一個頂點都計算一遍,總的時間復雜度是O(n^3)。






————————————









舉一個栗子:



上圖的頂點A和頂點C沒有直接相連的邊,它們之間的直接距離是無窮大。

如果以B作為“中繼頂點”,此時A到C的最短路徑就是A-B-C,最短距離是3+2=5。





再舉一個栗子:



上圖的頂點A和頂點C直接相連,距離是6。但是存在一條“迂回”路徑A-B-C,距離是3+2=5<6。

所以,經過中繼頂點B,從A到C的最短距離可以是5。





下面我們來看一看Floyd算法的詳細步驟。


1.要實現Floyd算法,首先需要構建帶權圖的鄰接矩陣:


在鄰接矩陣當中,每一個數字代表著從某個頂點到另一個頂點的直接距離,這個距離是沒有涉及到任何中繼頂點的。


2.此時假定只允許以頂點A作為中繼頂點,那么各頂點之間的距離會變成什么樣子呢?

B和C之間的距離原本是無窮大,此時以A為中繼,距離縮短為AB距離+AC距離=

5+2=7。

更新對應矩陣元素(橙色區域代表頂點A到其他頂點的臨時距離):



3.接下來以頂點A、B作為中繼頂點,那么各頂點之間的距離會變成什么樣子呢?

A和D之間的距離原本是無窮大,此時以B為中繼,距離縮短為AB距離+BD距離=5+1=6。

A和E之間的距離原本是無窮大,此時以B為中繼,距離縮短為AB距離+BE距離=5+6=11。

更新對應矩陣元素(橙色區域代表頂點B到其他頂點的臨時距離):



4.接下來以頂點A、B、C作為中繼頂點,那么各頂點之間的距離會變成什么樣子呢?

A和F之間的距離原本是無窮大,此時以C為中繼,距離縮短為AC距離+CF距離=2+8=10。

更新對應矩陣元素(橙色區域代表頂點C到其他頂點的臨時距離):


.........

.........


以此類推,我們不斷引入新的中繼頂點,不斷刷新矩陣中的臨時距離。

最終,當所有頂點都可以作為中繼頂點時,我們的距離矩陣更新如下:



此時,矩陣中每一個元素,都對應著某頂點到另一個頂點的最短距離。



為什么這么說呢?讓我們回顧一下動態規劃的兩大要素:

問題的初始狀態
問題的狀態轉移方程式


對于尋找圖的所有頂點之間距離的問題,初始狀態就是頂點之間的直接距離,也就是鄰接矩陣。


而問題的狀態轉移方程式又是什么呢?

假設新引入的中繼頂點是n,那么:


頂點i 到 頂點j 的新距離 = Min(頂點i 到 頂點j 的舊距離,頂點i 到 頂點n 的距離+頂點n 到 頂點j 的距離)



  • final static int INF = Integer.MAX_VALUE;


  • public static void floyd(int[][] matrix){

  • //循環更新矩陣的值

  • for(int k=0; k<matrix.length; k++){

  • for(int i=0; i<matrix.length; i++){

  • for(int j=0; j<matrix.length; j++){

  • if(matrix[i][k] == INF || matrix[k][j] == INF) {

  • continue;

  • }

  • matrix[i][j] = Math.min(matrix[i][j], matrix[i][k] + matrix[k][j]);

  • }

  • }

  • }

  • // 打印floyd最短路徑的結果

  • System.out.printf("最短路徑矩陣: \n");

  • for (int i = 0; i < matrix.length; i++) {

  • for (int j = 0; j < matrix.length; j++)

  • System.out.printf("%3d ", matrix[i][j]);

  • System.out.printf("\n");

  • }

  • }





  • public static void main(String[] args) {

  • int[][] matrix = {

  • {0, 5, 2, INF, INF, INF, INF},

  • {5, 0, INF, 1, 6, INF, INF},

  • {2, INF, 0, 6, INF, 8, INF},

  • {INF, 1, 6, 0, 1, 2, INF},

  • {INF, 6, INF, 1, 0, INF, 7},

  • {INF, INF, 8, 2, INF, 0, 3},

  • {INF, INF, INF, INF, 7, 3, 0}

  • };

  • floyd(matrix);

  • }






  • 福利

    掃描添加小編微信,備注“姓名+公司職位”,加入【云計算學習交流群】,和志同道合的朋友們共同打卡學習!



    推薦閱讀:

    • 太形象了!什么是邊緣計算?最有趣的解釋沒有之一!

    • 互聯網出海十年

    • 華為員工年薪 200 萬!真相讓人心酸!

    • 天才程序員:25 歲進貝爾實驗室,32 歲創建信息論 ?琥珀 ?極客寶寶 ?5天前

    • 安全顧問反水成黑客, 靠瞎猜盜得5000萬美元的以太幣, 一個區塊鏈大盜的另類傳奇

    • 人造器官新突破!美國科學家3D打印出會“呼吸”的肺 | Science


    真香,朕在看了!

    總結

    以上是生活随笔為你收集整理的漫画:图的 “多源” 最短路径的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。