迪傑斯特拉演算法 Dijkstra演算法

2021-09-30 11:24:58 字數 1095 閱讀 2701

直接給出dijkstra演算法的偽**,他可以算出從單個源點出發,到所有結點的最短路。該演算法同時適用於有向圖和無向圖

清楚所有點的座標

設d[0]=0,其他d[i]=inf

迴圈n次

下面是偽**對應的程式。假設起點是結點0,他到結點i的路徑長度為d[i]。未標號結點的v[i]=0,已標號結點的v[i]=1。w[x][y]=-1表示邊(x,y)不存在。

除了求出最短路的長度以外,使用dijkstra演算法也能方便的地列印出結點0到所有結點的最短路本身,方法就是從終點出發,不斷順著d[i]+w[i][j]=d[j]的邊(i,j)從結點j退回到結點i,直到回到起點。另外也可以用空間換時間,在更新d陣列時維護父親結點。即

memset(v,0,sizeof(v));

for(int i = 0; i < n; i++) d[i]=(i==0 ? 0 : inf);

for(int i = 0; i < n; i++)

}

稀疏圖的鄰接表:

不難看出,上面的程式的時間複雜度為o(n*n)。由於最短路演算法實在太重要,我們有必要把他優化到o(mlongn),其中m是邊的個數。在學習稀疏圖的時候,首先要掌握圖的新表示法。既然m遠小於n*n,那麼鄰接矩陣中會有大量表示「此邊不粗拿在」的元素,不僅浪費了空間,而且也降低了時間效率。為了解決這個問題,我們可以是用vectorg[maxn]儲存稀疏圖,但這裡想介紹的是另外一種流行了表示法,鄰接表。在這種表示方法中,每個結點i都有乙個鍊錶,裡面儲存著從i出發的所有邊。對於無向圖來說,每條邊會在鄰接表**現兩次。和前面一樣,這裡繼續是用陣列實現鍊錶。首先對於每條邊編號,然後用first[u]儲存結點u的第一條邊的編號,next[e]表示編號e的邊的下一條邊的編號。下面是構建圖的**。

int n, m;

int first[maxn];

int u[maxm],v[maxm],w[maxm],next[maxm]

void read()

}

接下來是用優先佇列加速dijkstra演算法。主要是在迴圈中獲取最小的d[i]時,用優先佇列來實現。

Dijkstra(迪傑斯特拉)演算法

迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。指定乙個節點,例如我們要計算 a 到其他節點的最短路徑 引入兩個集合 s u s集合包含已求出的最短路徑的點 以及相...

dijkstra迪傑斯特拉演算法

注意 1.標頭檔案climits的int max,加上2整數會溢位,每次相加前得判斷被加值是否為int max,int max 10為負數 2.得先初始化再對d s c s g,cost等賦值 fill d 0 d 0 max,int max fill g 0 0 g 0 0 max max,int...

迪傑斯特拉 Dijkstra 演算法

迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。通過dijkstra計算圖g中的最短路徑時,需要指定起點s 即從頂點s開始計算 dijkstra演算法算是貪心思想實...