Dijkstra演算法C 實現總結

2022-05-04 18:42:11 字數 1233 閱讀 4303

求無負權圖中點s到點t的最短凝聚力

標準說法中,「縮短」/「鬆弛」(relax)操作是對邊進行的。下面為了行文方便,將其拓展到點。即以下操作,其中a表示目前已經算出的點i到j的距離:

a[i][j]=min(a[i][v] + a[v][j] , a[i][j]) (同時維護path陣列)

類似於按拓撲排序的順序,對所有點進行縮短操作。

下面具體闡述。

用d[i]記錄已算出的點s到點j之間的距離,path[j]記錄目前算出的s到j最短路徑中,j節點的上乙個節點

將點分為兩個集合:已完成的known和未完成的unknown.

初始時,將所有d賦為無窮大,d[s]賦為0;所有點均為unknown

迴圈:對unknown的所有點,擇其d最小者,進行縮短操作,該點加入known。直到所有點都為known。

用乙個陣列known,known[i]為1則表示known,為0 表示unknown

假設輸入的鄰接矩陣中,每點與自己的權值為0,不鄰接的兩點權值為max,max被巨集定義為乙個非常大但不容易溢位的整數。

受編譯器原理的限制,c/c++將多維動態陣列作為函式引數傳遞是非常麻煩的,比如鄰接矩陣。

#includeusing namespace std;

#define max 50000

void printpath(int path, int n,int s,int t)

//relax(minpos); modify dis and parent

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

}known[v] = 1;

} //--------------輸出&釋放記憶體----------------------

dists2t = distance[t];

cout << dists2t

cout << path[i] << " ";

cout << endl;

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

cout << distance[i]<<" ";

cout << endl;

printpath(path, n, 0, 6);

delete known;

delete distance;

delete path;

while (1);

return 0;

}

Dijkstra演算法 C 實現

對於圖g v,e 給定源點 s 屬於 v 單源路徑是指從 s 到圖中其他各頂點的最短路徑.下圖為帶權有向圖,從 v0 到其餘各個頂點的最短路徑如表所示。源點終點 最短路徑 路徑長度 v0v1 v0 v1 12v2 v0 v2 10v3 v0 v4 v3 50v4 v0 v4 30v5 v0 v4 v...

dijkstra演算法實現

include include using namespace std const int maxnum 100 const int maxint 999999 各陣列都從下標1開始 int dist maxnum 表示當前點到源點的最短路徑長度 int prev maxnum 記錄當前點的前乙個結...

Dijkstra演算法 c語言實現

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