学习笔记:迪杰斯特拉算法

Posted arseneyao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记:迪杰斯特拉算法相关的知识,希望对你有一定的参考价值。

一、算法概要

1.迪杰斯特拉算法是典型的单源最短路径算法。

2.主要特点是以起始点为中心向外扩展,直到扩展至终点为止。

 

二、算法步骤

1.将图中的顶点划分为两组,第一组为已求出最短路径的顶点,第二组为未确定最短路径的顶点。

2.初始时,第一组只包含起始点。

3.从第一组中选择最近一次加入的顶点,找到该顶点在第二组中最近的邻接点。以该邻接点为中心点更新各点到起始点的距离,若从起始点经过该邻接点到达任意顶点的距离小于原来的距离,则更新之。若更新则更新的距离为 起始点到邻接点的距离+邻接点到该任意顶点的距离。

4.重复上一步直至所有第二组中的顶点都加入第一组。

 

三、代码实现

注意:无穷大若取INT_MAX,INT_MAX + INT_MAX会因为位溢出而变成负无穷。

 

#include <iostream>
#include <algorithm>

const int maxn = 100;
const int inf = 1061109567;
int n, m;
int g[maxn][maxn];
bool vis[maxn];
int dis[maxn];

int dijkstra(int v1, int v2) {
    for (int i = 1; i <= n; i++) {
        vis[i] = false;
        dis[i] = g[v1][i];
    }
    vis[v1] = true;
    dis[v1] = 0;
    for (int i = 1; i <= n; i++) {
        int min = inf;
        int k = 0;
        for (int j = 1; j <= n; j++)
            if (!vis[j] && dis[j] < min) {
                min = dis[j];
                k = j;
            }
        vis[k] = true;
        for (int j = 1; j <= n; j++)
            if (!vis[j])
                dis[j] = std::min(dis[j], dis[k] + g[k][j]);
    }
    return dis[v2];
}

int main() {
    std::cin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            g[i][j] = inf;
    for (int i = 0; i < m; i++) {
        int v1, v2, w;
        std::cin >> v1 >> v2 >> w;
        g[v1][v2] = w;
        g[v2][v1] = w;
    }
    return 0;
}

 

以上是关于学习笔记:迪杰斯特拉算法的主要内容,如果未能解决你的问题,请参考以下文章

(王道408考研数据结构)第六章图-第四节4:最短路径之迪杰斯特拉算法(思想代码演示答题规范)

迪杰斯特拉算法完整代码(Java)

求多重邻接表的迪杰斯特拉算法

图论——迪杰斯特拉算法和最小生成树

迪杰斯特拉算法为啥不能有负权边

迪杰斯特拉算法的算法思想