1. 程式人生 > >Dijkstra [迪傑斯特拉]演算法思路(求單點到其他每個點的各個最短路徑)Floyd演算法:任意兩點間最短距離

Dijkstra [迪傑斯特拉]演算法思路(求單點到其他每個點的各個最短路徑)Floyd演算法:任意兩點間最短距離

先給出一個無向圖

用Dijkstra演算法(迪傑斯特拉演算法)找出以A為起點的單源最短路徑步驟如下

應用Dijkstra演算法計算從源頂點1到其它頂點間最短路徑的過程列在下表中。

Dijkstra演算法的迭代過程:

Floyd演算法思想:

1、從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,如果兩點之間沒有邊相連,則權為無窮大。 2、對於每一對頂點 u 和 v,看看是否存在一個頂點 w 使得從 u 到 w 再到 v 比已知的路徑更短。如果是更新它。 把圖用鄰接矩陣G表示出來,如果從Vi到Vj有路可達,則G[i,j]=d,d表示該路的長度;否則G[i,j]=無窮大。定義一個矩陣D用來記錄所插入點的資訊,D[i,j]表示從Vi到Vj需要經過的點,初始化D[i,j]=j。把各個頂點插入圖中,比較插點後的距離與原來的距離,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值變小,則D[i,j]=k。在G中包含有兩點之間最短道路的資訊,而在D中則包含了最短通
路徑
的資訊。 比如,要尋找從V5到V1的路徑。根據D,假如D(5,1)=3則說明從V5到V1經過V3,路徑為{V5,V3,V1},如果D(5,3)=3,說明V5與V3直接相連,如果D(3,1)=1,說明V3與V1直接相連。

最短距離有三種情況:
1、兩點的直達距離最短。(如下圖<v,x>)
2、兩點間只通過一箇中間點而距離最短。(圖<v,u>)
3、兩點間用通過兩各以上的頂點而距離最短。(圖<v,w>)

對於第一種情況:在初始化的時候就已經找出來了且以後也不會更改到。
對於第二種情況:弗洛伊德演算法的基本操作就是對於每一對頂點,遍歷所有其它頂點,看看可否通過這一個頂點讓這對頂點距離更短,也就是遍歷了圖中所有的三角形(演算法中對同一個三角形掃描了九次,原則上只用掃描三次即可,但要加入判斷,效率更低)。
對於第三種情況:如下圖的五邊形,可先找一點(比如x,使<v,u>=2),就變成了四邊形問題,再找一點(比如y,使<u,w&gt;=2),可變成三角形問題了(v,u,w),也就變成第二種情況了,由此對於n邊形也可以一步步轉化成四邊形三角形問題。(這裡面不用擔心哪個點要先找哪個點要後找,因為找了任一個點都可以使其變成(n-1)邊形的問題)。

結合程式碼 並參照上圖所示 我們來模擬執行下 這樣才能加深理解:
第一關鍵步驟:當k執行到x,i=v,j=u時,計算出v到u的最短路徑要通過x,此時v、u聯通了。
第二關鍵步驟:當k執行到u,i=v,j=y,此時計算出v到y的最短路徑的最短路徑為v到u,再到y(此時v到u的最短路徑上一步我們已經計算過來,直接利用上步結果)。
第三關鍵步驟:當k執行到y時,i=v,j=w,此時計算出最短路徑為v到y(此時v到y的最短路徑長在第二步我們已經計算出來了),再從y到w。

依次掃描每一點(k),並以該點作為中介點,計算出通過k點的其他任意兩點(i,j)的最短距離,這就是floyd演算法的精髓!


相關推薦

Dijkstra []演算法思路其他每個各個路徑Floyd演算法任意兩點短距離

先給出一個無向圖 用Dijkstra演算法(迪傑斯特拉演算法)找出以A為起點的單源最短路徑步驟如下 應用Dijkstra演算法計算從源頂點1到其它頂點間最短路徑的過程列在下表中。 Dijkstra演算法的迭代過程: Floyd演算法思想: 1、從任意一條單邊路徑開

路徑-Dijkstra()演算法

最短路徑-Dijkstra(迪傑斯特拉)演算法 網圖的最短路: 最短路徑,是指兩頂點之間經過的邊上權值之和最小的路徑,並且我們稱路徑的第一個頂點是源點,最後一個頂點是終點 Dijkstra(迪傑斯特拉)演算法: 概況: 按路徑長度

資料結構之路徑Dijkstra()演算法

1)常用的圖最短路徑的演算法有兩個:Dijkstra演算法和Floyd演算法; 2)Dijkstra演算法適用於求圖中兩節點之間最短路徑,Floyd演算法適於求圖中任意兩節點間; 3)兩種演算法的主要思想是動態規劃,而Dijkstra演算法設計比較巧妙的是:在求源節點到終結

路徑演算法1Dijkstra()演算法

Dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率

Dijkstra 演算法詳細步驟及實現

1,迪傑斯特拉演算法介紹 迪傑斯特拉演算法是典型最短路徑演算法,用於計算圖或網中某個特定頂點到其他所有頂點的最短路徑。主要特點是以起始點為中心向外,層層擴充套件,直到擴充套件覆蓋所有頂點。 2,迪傑斯特拉演算法思想 設G=(V,E)為一個帶全有向圖,把圖中頂點集合

路徑Dijkstra()演算法無向圖

簡介 Dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。由for迴圈可知,其

路徑演算法Dijkstra()演算法分析與實現(Python)

December 18, 2015 12:56 PM Dijkstra(迪傑斯特拉)演算法是典型的最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法能得出最短路徑的

路徑演算法Dijkstra()演算法分析與實現(C/C++)

Dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。   Dijks

dijkstra演算法

在圖的應用中,有一個很重要的需求:我們需要知道從某一個點開始,到其他所有點的最短路徑。    這其中,Dijkstra演算法是典型的最短路徑演算法。它的關鍵思想是以起始點為中心,向外一層層擴散,直到擴充套件到終點為止。Dijkstra演算法能夠得出最短路徑的最優解,不過

路徑演算法Dijkstra()演算法分析與實現(C/C++)及其他 + leetcode習題實踐

   最短路徑求解  最短路徑的常用解法有迪傑克斯特拉演算法Dijkstra Algorithm, 弗洛伊德演算法Floyd-Warshall Algorithm, 和貝爾曼福特演算法Bellman-Ford Algorithm,其中,Floyd演算法是多源最短路徑,即求

筆記路徑算法—Dijkstra()

意思 最終 else min out 拓展 clas stream 便是 文中代碼下如下: #include<iostream> #include<cstdio> #include<fstream> #include<algor

Dijkstra 尋找全域性路徑實現 純程式碼

原理參考 https://www.cnblogs.com/chxer/p/4542068.html 程式碼實現 #include <stdio.h> #include <string.h> #include <math.h> #define

堆優化的dijkstra()

前面在講prim演算法的時候已經提到了dijkstra,這裡再說說求最短路的dijkstra演算法; 相比於鄰接矩陣的存圖方式我們可以用更適用於做題的鏈式前向星,更省空間; 我們也可以用STL的priority_queue優先佇列進行優化(手寫堆太麻煩了~~) 下面看程式碼

深度優先搜索BFS和廣度優先搜索 DFS)還有 算法dijkstra)

path pat info 退回 bsp 分享圖片 span 一個 sta 首先我們根據我隨意設定的一個路徑建立一個字典 path = { "A":{"B", "C"}, "B":{"A", "D", "E"}, "C":{"A",

深入理解Dijkstra演算法正確思路+優化+原理

這裡需要一個很好的例子,這裡先拿網上流傳的例子作為反例。 問題1:不符合勾股定理 AC=3,CB=2,AB=6 難道這樣真的無傷大雅嗎?假設你的起點是A,終點是B,難道不應該是兩點之間線段最短嗎?、 問題2:完美地掃到了每個點 按照他的思維邏輯來,確實每個點都可以掃

路徑問題dijkstra演算法

題目描述 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。 輸入描述: 輸入n,m,點的編號是1~n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其

(Dijkstra) —— 短路演算法

Dijkstra是最短路基礎演算法之一(還有判負環的SPFA和多源最短路的Floyd),但在正常情況下Dijkstra是最快的,也同樣是最難打的(其實都不是很難),接下來我們來談談具體演算法: 1.適用範圍:沒有負環(就是走一圈就可以將路程變小,沒有最短路的圖)的單源最短路

[圖] 6.2.1 Dijkstra演算法|演算法

求兩個頂點間的最短路徑 相關資料結構 dist[v]:起點到結點v的最短路徑的距離為dist[v] path[v]:起點到結點v的最短路徑path中,結點v的前一個結點為path[v] 【特殊值】p

圖解-演算法路徑Dijkstra's Algorithm (finding shortestpaths)

轉自:http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/11-Graph/dijkstra2.html   一. 圖解迪傑斯特拉   Before showing you the&nb

路徑 路徑Dijkstra演算法 Floyd弗洛伊德演算法

兩個演算法的主要思想都是鬆弛,就是兩點間的距離通過第三點來變短 比如   1->3=10     1->2=2   2->3=5    這樣你就可以通過2號點把1,3兩點的距離縮短為7 Dijkstra演算法被稱為單源最短路,意思就是隻能計算某個點到