Dijkstra算法例題
最短路徑算法
Dijkstra 算法(一般音譯成迪傑斯特拉算法)無非就是一個 BFS 算法的加強版,它們都是從二叉樹的層序遍歷衍生出來的。
缺點:
迪傑斯特拉算法無法處理負權重邊
例題:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 2510;
//初始化 g表示鄰接矩陣 dist表示點x到每個點的距離 st表示是否走過這個節點
int g[N][N], dist[N], st[N];
int n = 2021;
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
int dijkstra() {
memset(dist, 0x3f, sizeof dist);//初始化dist數組,用memset設置每個字節 設0x3f為最大值
dist[1] = 0;//第一個節點到自己的距離為0
//依次選擇節點
for (int i = 1;i <= n;i++) {
int t = -1;
//遍歷所有節點
for (int j = 1;j <= n;j++) {
//如果j節點沒有被走過 同時記錄下j節點的下標,如果有距離更小的就更新
if (!st[j] && (t == -1 || dist[j] < dist[t]))
t = j;
}
//選擇這個距離最小的下標 記錄為走過
st[t] = 1;
//再次遍歷所有節點
for (int j = 1;j <= n;j++) {
//到節點j距離最小是否要更新
dist[j] = min(dist[j], dist[t] + g[t][j]);
}
}
return dist[n];
}
int main() {
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++) {
if (i != j) {
if (fabs(i - j) <= 21) {//fabs()絕對值
g[i][j] = lcm(i, j);
g[j][i] = lcm(i, j);
}
else {
g[i][j] = 0x3f3f3f3f;
g[j][i] = 0x3f3f3f3f;
}
}
}
cout << dijkstra();
//cout<<0x3f3f3f3f;
return 0;
}