码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-01-04 00:18:33      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:log   min   bsp   body   jks   学习笔记   turn   学习   post   

一、算法概要

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

 

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

标签:log   min   bsp   body   jks   学习笔记   turn   学习   post   

原文地址:https://www.cnblogs.com/arseneyao/p/8184921.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!