Dijkstra算法例題


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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM