1. 程式人生 > >單源最短路徑-迪傑斯拉特演算法

單源最短路徑-迪傑斯拉特演算法

思路:

    在網路中,從某個頂點Vx出發到達另外一個頂點Vi,往往有多條路徑,其中,邊的權值之和最小的路徑稱為最短路徑,並稱Vx為這條最短路徑的源點,Vi為終點。

    顯然,邊最少的路徑不一定是最短路徑。

    求網路中從指定源點到其餘各頂點的最短路徑的問題,通常稱為單源最短路徑問題。

迪傑斯拉特方法:

    當n個頂點的有向網路和源點都給定以後,如何求得該源點到其餘各頂點的最短路徑?

    迪傑斯拉特提出了一個解決此問題的簡單方法,即按最短路徑長度由小到大的次序,逐步求得每一條最短路徑。


迪傑斯拉特演算法中三個輔助陣列的作用:

    1、d[i]記錄從源點Vx到頂點Vi的“當前最短的”路徑長度值

    2、path[i]記錄從源點Vx到頂點Vi的"當前最短的"路徑上倒數第二個頂點的序號

    3、s[i]=true表示從源點Vx到頂點Vi的最短路徑已最終確定;s[i]=false表示源點Vx到頂點Vi的最短路徑尚未最終確定。

演算法key process:

    初始化,確定第i條最短路徑的終點,修正源點到其餘各頂點的最短路徑。直到全部確定完畢為止

程式碼:

//迪傑斯特拉演算法
template <class T>
void ExtMGraph<T>::Dijkstra(int v,T* d,int* path)
{
	   int i,k,w;	
	   if (v<0||v>n-1) {
           cout<< “OutOfBounds”;  return;
      }
	   bool *s=new bool[n]; 
       for (i=0;i<n;i++){
           s[i]=false; d[i]=a[v][i];
           if (i!=v && d[i]<INFTY) path[i]=v;
           else path[i]=-1;
	   }
s[v]=true; //d[v]=0; 

      for (i=1;i<n;i++){
           //確定第i條最短路徑的終點序號k
            k=Choose(d,s);
            s[k]=true;  
          //修正源點到其餘各頂點的最短路徑      
            for (w=0; w<n; w++)             
                 if (!s[w] && d[k]+a[k][w]< d[w]){     
                     d[w]=d[k]+a[k][w]; 
                     path[w]=k;
	             }
      }
}
template <class T>
int ExtMGraph<T>::Choose(int* d, bool* s)
{
   int i,minpos; T min;
   min=INFTY; 
   minpos=-1;
   for (i=1;i<n;i++)
       if (d[i]<min &&!s[i]){
             min=d[i];
             minpos=i;
       }
   return minpos;
}

演算法分析:

    -上述演算法的執行時間為O(n^2);

    -如果只希望求從源點到某一特定頂點之間的最短路徑,也需要與求單源最短路徑相同的時間複雜度O(n^2)

相關推薦

路徑-演算法

思路:    在網路中,從某個頂點Vx出發到達另外一個頂點Vi,往往有多條路徑,其中,邊的權值之和最小的路徑稱為最短路徑,並稱Vx為這條最短路徑的源點,Vi為終點。    顯然,邊最少的路徑不一定是最短路徑。    求網路中從指定源點到其餘各頂點的最短路徑的問題,通常稱為單源

路徑——(Dijkstra)演算法 C++實現

求最短路徑之Dijkstra演算法 Dijkstra演算法是用來求單源最短路徑問題,即給定圖G和起點s,通過演算法得到s到達其他每個頂點的最短距離。 基本思想:對圖G(V,E)設定集合S,存放已被訪問的頂點,然後每次從集合V-S中選擇與起點s的最短距離最小的一個頂點(記為u),訪問並加入集合

圖->路徑->路徑(演算法Dijkstra)

 文字描述   引言:如下圖一個交通系統,從A城到B城,有些旅客可能關心途中中轉次數最少的路線,有些旅客更關心的是節省交通費用,而對於司機,里程和速度則是更感興趣的資訊。上面這些問題,都可以轉化為求圖中,兩頂點最短帶權路徑的問題。     單源點的最短路徑問題: 給定帶權有向圖G

路徑-(Dijkstra)演算法的實現

/************************************************************************ * * 檔名:7.1.1.cpp * * 檔案描述:Dijkstra演算法的實現(好久沒寫程式碼了,看來我還是適合codeing

路徑——坷垃演算法(有向圖、路徑

最短路徑的演算法有兩種:迪傑斯坷垃演算法和弗洛伊德演算法。 但是兩種演算法各有優劣: 迪傑斯坷垃演算法適合單源點最短路徑的獲取, 弗洛伊德演算法適合各點間最短路徑的獲取,即多源點最短路徑的獲取; 今天主要講解迪傑斯坷垃演算法。 一、演算法步驟: 1、獲取鄰接矩陣,確定起始點

圖|路徑——(Dijkstra)弗洛伊德(Floyd)

最短路徑——迪傑斯特拉(Dijkstra)弗洛伊德(Floyd) 一、迪傑斯特拉演算法(Dijkstra) 1. 問題: 求從每個源點到其餘各頂點的最短路徑。 2.儲存結構: 1)圖的儲存結構: 帶權的鄰接矩陣 2)輔助陣列: 一維陣列dist:dist[ i ]表示

路徑演算法和弗洛伊德演算法實現

迪傑斯特拉演算法: 矩陣二位陣列矩陣T儲存頂點vi到各頂點的最短路徑值,初始狀態為鄰接頂點為弧的權值,非鄰接頂點為無窮大。陣列S用於儲存最短路徑,儲存單元為該弧的前驅頂點的下標和與前驅頂點之間的弧的權值。 1.從T中找出一條弧值最小的弧(vi,vj),將該弧加入S中,並根據vj的鄰接點vx更

路徑演算法Python實現

回顧下最短路徑的地傑斯特拉演算法 迪傑斯特拉演算法是求從某一個起點到其餘所有結點的最短路徑,是一對多的對映關係,是一種貪婪演算法 示例: 演算法實現流程思路: 迪傑斯特拉演算法每次只找離起點最近的一個結點,並將之併入已經訪問過結點的集合(以防重複訪問,陷入死迴圈),然後

路徑 演算法的簡易實現 大話資料結構 P261改編

對應圖 #include<stdio.h> #define big 65530 #define max 100 int path[max]={0}; int shortpath[max]={0}; typedef struct Node{ c

資料結構圖之三(路徑--演算法

1 #include <iostream> 2 #include "SeqList.h" 3 #include "Stack.h" 4 #include <iomanip> 5 using namespace std; 6 7 #defin

路徑演算法(Dijkstra),用c語言實現

首先,迪傑斯特拉演算法是用來解決單源最短路經問題的,主要是通過邊的鬆弛來實現。 我們來看這個問題: 這個問題求得是從1號頂點到達所有其他頂點的最短距離,我們用鄰接矩陣來儲存這個圖,如下: 我們用一個dis陣列來儲存從一號頂點到其他各個頂點的初始路徑,如圖

無向圖求路徑 (dijkstra)演算法實現

Dijkstra演算法說明  http://ibupu.link/?id=29namespace ConsoleApp14 { class Program { public static int M = -1; static

[從今天開始修煉資料結構]圖的路徑 —— 演算法和弗洛伊德演算法的詳解與Java實現

在網圖和非網圖中,最短路徑的含義不同。非網圖中邊上沒有權值,所謂的最短路徑,其實就是兩頂點之間經過的邊數最少的路徑;而對於網圖來說,最短路徑,是指兩頂點之間經過的邊上權值之和最少的路徑,我們稱路徑上第一個頂點是源點,最後一個頂點是終點。 我們講解兩種求最短路徑的演算法。第一種,從某個源點到其餘各頂點的最短路徑

數據結構 - 路徑(Dijkstra)算法詳解(Java)

previous 代碼 map class matrix () count 就是 可能   給出一個圖,求某個端點(goal)到其余端點或者某個端點的最短路徑,最容易想到的求法是利用DFS,假設求起點到某個端點走過的平均路徑為n條,每個端點的平均鄰接端點為m,那求出這個最短

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

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

路徑長度Dijkstra(演算法

求單源最短路徑長度的時間複雜度為O(n*n),空間複雜度同樣為O(n*n),n為總的節點個數 模組化實現函式原始碼如下: #define POINT 250 #define MAXLENGTH 1000001 int road[POINT][POINT]; int len

演算法基礎【6】路徑——詳解Bellman-Ford、演算法

首先我們構造研究物件:計算從V0開始到所有節點的最短路徑1、dijkstra,D演算法首先我們將需要計算最小路徑的入口點的Cost複製到一個D數組裡。(鄰接矩陣對應的行)我們知道第一個節點到達的各個頂點所需的花費(路程)(無法到達花費是正無窮)找到最近的那個點。存下來(如果我

路徑(Dijkstra)演算法

Dijkstra演算法1.定義概覽Dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算一個節點(節點需為源點)到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法是很有代表性的最短路徑演算法,注

路徑(Dijkstra)演算法的改進

Dijkstra演算法1.定義概覽Dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算一個節點(節點需為源點)到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法是很有代表性的最短路徑演算法,注

P3371 【模板】路徑

logs alt front 最短路徑 ios num return struct 有向圖 題目描述 如題,給出一個有向圖,請輸出從某一點出發到所有點的最短路徑長度。 輸入輸出格式 輸入格式: 第一行包含三個整數N、M、S,分別表示點的個數、有向邊的個數