Dijkstra演算法的流程圖

2021-08-03 14:32:53 字數 1732 閱讀 1880

需求和規格說明:

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

演算法本身並不是按照我們的思維習慣——求解從原點到第乙個點的最短路徑,再到第二個點的最短路徑,直至最後求解完成到第n個點的最短路徑,而是求解從原點出發的各有向路徑的從小到大的排列,但是演算法最終確實得到了從原點到圖中其餘各點的最短路徑,可以說這是個副產品,對於演算法的終結條件也應該以求得了原點到圖中其餘各點的最短路徑為宜。清楚了演算法的這種巧妙構思後,理解演算法本身就不是難題了。實現注釋:

想要實現的功能:

dijkstra演算法是用來求任意兩個頂點之間的最短路徑。在該實驗中,我們用鄰接矩陣來儲存圖。在該程式中設定乙個二維陣列來儲存任意兩個頂點之間的邊的權值。

使用者可以將任意乙個圖的資訊通過鍵盤輸入,讓後在輸入要查詢的兩個頂點,程式可以自動求出這兩個頂點之間的最短路徑。

已經實現的功能:

在該實驗中,我們用鄰接矩陣來儲存圖。在該程式中設定乙個全域性變數的二維陣列,用它來儲存任意兩個頂點之間的邊的權值。然後通過最短路徑的計算,輸入從任意兩個頂點之間的最短路徑的大小。

使用者手冊:

對於改程式,不需要客戶進行什麼複雜的輸入,關鍵是用來存放圖的任意兩個頂點之間的邊的權值的二維陣列的初始化,即將要通過dijkstra演算法求最短路徑的圖各條邊的權值放入二維陣列中。這樣程式就可以自動的計算出任意兩個頂點之間的最短路徑並且進行輸出。

設計思想:

s為源,w[u,v] 為點u 和v 之間的邊的長度,結果儲存在 dist

初始化:源的距離dist[s]設為0,其他的點距離設為無窮大,同時把所有的點狀態設為沒有擴充套件過。

迴圈n-1次:

1. 在沒有擴充套件過的點中取一距離最小的點u,並將其狀態設為已擴充套件。

2. 對於每個與u相鄰的點v,如果dist[u] + w[u,v] < dist[v],那麼把dist[v]更新成更短的距離dist[u] + w[u,v]。此時到點v的最短路徑上,前乙個節點即為u。

結束:此時對於任意的u,dist[u]就是s到u的距離。

程式源**:

#include

#include "conio.h"

#define true 1

#define false 0

#define i 9999無窮大

#define n 5城市頂點的數目

int cost[n][n] = ,

,,,};int dist[n儲存當前最短路徑長度

int v0 = 'a' - 65初始點是 a

int main()

首先選v0到v0的距離一定最短,最終資料

final[v0] = true;

尋找另外 n-1 個結點

for (i = 0; i < n-1; i++)

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

printf("\n");

v0++;

}return 0;

}執行結果:

除錯報告:

錯誤:執行結果如下:

而正確的執行結果是這樣的:

出現的問題是在尋找最短路徑和更新 dist 資料的兩個for迴圈之間少了乙個賦值語句。如下:

final[v] = true加入新邊

當每次找到從v0到其它各定點的最短路徑是,將該定點標記為已經找到了最短路徑,下次查詢是不再對該頂點的dist的值進行改變。

流程圖5 裝修驗收流程圖

使用者室內裝修驗收流程圖 合格不合格 美文欣賞 1 走過春的田野,趟過夏的激流,來到秋天就是安靜祥和的世界。秋天,雖沒有玫瑰的芳香,卻有秋菊的淡雅,沒有繁花似錦,卻有碩果累累。秋天,沒有夏日的激情,卻有浪漫的溫情,沒有春的奔放,卻有收穫的喜悅。清風落葉舞秋韻,枝頭碩果醉秋容。秋天是甘美的酒,秋天是壯...

流程圖的畫法

1 各司其職的形狀 1 開始和結束 作為整張流程圖的頭和尾,必須標清楚到底具體指哪個頁面,以免日後出現歧義。2 網頁 如你所見,網頁的形狀是乙個帶有漂亮的淡藍色過渡效果的長方形,它的邊框為深藍色,中間寫明了這個網頁的用途,括號中的數字代表這個形狀所對應的demo檔案的名稱 比如這裡是2.html 我...

流程圖的畫法

流程圖是由一些圖框和流程線組成的,其中圖框表示各種操作的型別,圖框中的文字和符號表示操作的內容,流程線表示操作的先後次序。一般用橢圓或圓角表示 開始 與 結束 圖表 1終結符 用矩形表示處理的內容 圖表 2處理框 用菱形表示問題判斷或判定 圖表 3判斷框 箭頭代表工作流方向 圖表 4 箭頭 輸入輸出...