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

posted @ 2022-04-07 20:30  BailanZ  阅读(938)  评论(0编辑  收藏  举报