Dijkstra演算法求單源最短路徑

2021-06-14 09:04:10 字數 1757 閱讀 6747

與prim演算法樸素版實現起來差不多。。。

//樸素版dijkstra演算法

//輸入乙個圖的矩陣,假定兩點不相鄰則權值為0

//輸出每個頂點的最短路徑長度,可以列印指定頂點的路徑

//dijkstra演算法跟prim演算法很像

//相同的地方是:

//兩者都有乙個已經求得"mst"和已經求得"最短路"的集合

//每納入乙個結點x到集合,更新的是集合外與x直接相連的點的key或者d;

//不同地方就是:

//prim中,key的意義是某點到集合 與之最近元素 的邊權

//dijkstra中,d的意思是某點到集合 給定起點元素 的最"短"路的邊權和

/*dijkstra演算法

每個頂點清除標記;

d[起點] = 0, d[其他點] = inf;

迴圈n次

*/ /*

參考測試資料

**——wiki百科的dijkstra演算法gif動態圖

輸入點的個數(程式中程式設計從0開始)

輸入起點

輸入矩陣

輸入任意點(求其路徑)60

0 7 9 0 0 14

7 0 10 15 0 0

9 10 0 11 0 2

0 15 11 0 6 0

0 0 0 6 0 9

14 0 2 0 9 03*/

#include using namespace std;

const int n = 110;

const int inf = 999999999;

int w[n][n]; //鄰接矩陣

bool done[n]; //若d[i]不再更新,則done[i]=true, 也即結點納入了解集

int d[n]; //d[i]記錄從起點到結點i的最短路徑長度

int par[n]; //par[i]儲存記錄i的父親結點

//建立圖

void creategraph(int n)

//star:單源起點

//n:結點數目

void dijkstra(int star, int n)

} //x的d[i]已經確定了

done[x] = 1;

//對所有x的邊(x, y)

for (y = 0; y != n; y++)

} } //迴圈n次

}//star:單源起點

//i:當前結點

void printpath(int star, int i)

printpath(star, par[i]);

cout << i << " ";

}int main()

cout << endl;

cout << "依次列印從起點" << star

<< "到n個結點的最短距離:" << endl;

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

cout << endl;

cout << "請輸出結點編號[0, n-1],以列印其最短路徑經過的結點:" << endl;

cin >> end;//0 ~ n-1

printpath(star, end);

cout << endl;

return 0;

}

Dijkstra演算法求單源最短路徑

dijkstra演算法求單源最短路徑 include include define vexsize 100 建立鄰接矩陣 int creat int cost vexsize return vexnum dijkstra演算法 void dijkstra int cost vexsize int v...

Dijkstra演算法(求單源最短路徑)

dijkstra演算法 原鏈結 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容...

Dijkstra演算法求單源最短路徑

1.綜述 dijkstra演算法解決的是帶權重的有向圖上單源最短路徑問題,該演算法要求所有邊的權重都為非負值。演算法重複從結點集 v s中選擇最短路徑估計最小的結點 u 將 u 加入到集合 s 然後對所有從 u 出發的邊進行 鬆弛操作 相當於遍歷選出最小權值 使用乙個最小優先佇列 q 來儲存結點集合...