• 最短路径—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;
    }

  • 相关阅读:
    HDU_1285_拓扑排序(优先队列)
    HDU_1087_Super Jumping! Jumping! Jumping!_dp
    STL_优先队列_(转载)
    数据结构课程笔记_拓扑排序
    滋阴清火中药方 (推荐--自用)
    文件与文档内容搜索工具软件
    CrossUI SPA Builder ---- feathers API框架
    广州交警网上车管所
    BIM 相关资料
    WIN10 ISO 官方
  • 原文地址:https://www.cnblogs.com/mxj961116/p/10349254.html
Copyright © 2020-2023  润新知