最短路径—Dijkstra算法

Posted mxj961116

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径—Dijkstra算法相关的知识,希望对你有一定的参考价值。

1.定义

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。

2.算法描述

1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

3.参考代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf = 0x7fffffff;
const int N = 1024;    //结点最大数量
int edge[N][N];     //存储图
bool visited[N];    //记录结点是否用于搜索过
int dis[N];     //各结点到源结点的最短距离

void init(int n){
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            if(i == j) {
                edge[i][j] = 0;
            }
            else{
                edge[i][j] = inf;
            }
        }
    dis[i] = inf;
    }
    memset(visited, false, sizeof(visited));
}


void dijkstra(int source,int n) {
    int num = source;
    int Min = inf;
    visited[num] = true;
    for(int i = 1; i <= n; i++) {
        dis[i] = min(dis[i],edge[num][i]);
    }
    for(int i = 1; i<= n-1; i++) {
        int Min = inf;
        for(int j = 1; j<=n; j++) {
            if(visited[j] == false && dis[j] < Min) {
                Min = dis[j];
                num = j;
            }
        }
        visited[num] = true;
        for(int k = 1; k <= n; k++) {
            if(edge[num][k] < inf) {
                if(visited[k] == false && dis[k] > dis[num] + edge[num][k]){
                    dis[k] = dis[num] + edge[num][k];
                }
            }
        }
    }
}

int main() {
    int n,m,source;
    scanf("%d%d", &n, &m);  //输入结点数和边数
    scanf("%d", &source);    //输入源结点
    init(n);
    for(int i = 1; i <= m; i++) {
        int Start, End, Distance;
        scanf("%d%d%d",&Start, &End, &Distance);
        edge[Start][End] = Distance;
    }
    dijkstra(source,n);
    for(int i = 1; i <= n; i++) {
        if(i != source)
        printf("%d-->%d  %d ", source, i, dis[i]);
    }
    return 0;
}








































































以上是关于最短路径—Dijkstra算法的主要内容,如果未能解决你的问题,请参考以下文章

Dijkstra算法

最短路径算法(Dijkstra)

图-最短路径-Dijkstra及其变种

最短路径 - Dijkstra算法

最短路径 Dijkstra 算法为啥边上的权值非负阿?

图文解析 Dijkstra单源最短路径算法