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

最短路径—Dijkstra算法

时间:2019-02-02 23:31:00      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:star   记录   scanf   ++   表示   using   size   eof   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\n", source, i, dis[i]);
    }
    return 0;
}

最短路径—Dijkstra算法

标签:star   记录   scanf   ++   表示   using   size   eof   dijkstra   

原文地址:https://www.cnblogs.com/mxj961116/p/10349254.html

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