迪杰斯特拉算法实现(C++)及用例测试

地图描述:如上图所示,求出北京到各个顶点的最短路径。
代码实现:

#include <stdio.h>
#include <vector>
#define INF 99999999    // 路径的最大值
using namespace std;

vector<int> Dijkstra(vector<vector<int>> &graph, int start){
    int n = graph.size();   // 存储图中的顶点个数
    vector<int> visit(n,0); // 标记已作为中间节点完成访问的顶点
    vector<int> dist(n,0);  // 存储从起点start到其他顶点的最短路径

    for(int i =0; i < n; i++){
        dist[i] = graph[start][i];  // 将dist数组初始化为最初图中的路径长度
    }
    visit[start] = 1;       // 标记起始顶点

    for(int i = 0; i < n; i++){     // 更新最短路径的循环,循环进行n次
        int min_dist = INF;         // 存储从起点到其他未被访问节点中的最短距离
        int middle = 0;             // 存储最短距离节点的编号

        // 遍历n个顶点,寻找当前未被访问的顶点中的距离起始顶点的最短距离的节点编号
        for(int j = 0; j < n; j++){
            // 如果visit[j] == 0, 说明顶点j未被访问,且mid_dist > dist
            if(visit[j] == 0 && min_dist > dist[j]){
                min_dist = dist[j];     // 更新最短距离min_dist为dist[j]
                middle = j;             // 更新顶点编号middle为j
            }
        }
        // 以middle为中间节点,再循环遍历其他所有节点
        for(int j = 0; j < n; j++){
            /* 如果当前遍历的节点j未曾作为过中间节点,并且
            从起始节点到j的距离dist[j]大于从起始节点到middle
            与从middle到j的距离和 */
            if(visit[j] == 0 && dist[j] > dist[middle] + graph[middle][j]){
                // 更新起始节点到j的距离dist[j], 更新为起始到middle与middle到j的距离和
                dist[j] = dist[middle] + graph[middle][j];
            }
        }
        visit[middle] = 1;      // 将middle顶点设置为已访问
    }
    return dist;            // 返回最短路径结果
}



int main(){
    vector<vector<int>> graph;      // 样例中对应的邻接矩阵
    // 0 北京
    // 1 天津
    // 2 郑州
    // 3 济南
    // 4 长沙
    // 5 海南
    int n = 6;
    for(int i = 0; i < n; i++){
        graph.push_back(vector<int>());
        for(int j = 0; j < n; j++){
            graph[i].push_back(INF);    // 初始化的全部路径为正无穷
        }
        graph[i][i] = 0;    // 某城市至该城市本身的距离是0
    }

    graph[0][1] = 100;  //北京to天津
    graph[1][0] = 100;  //天津to北京

    graph[0][2] = 1200; //北京to郑州
    graph[2][0] = 1200; //郑州to北京

    graph[1][2] = 900;  //天津to郑州
    graph[2][1] = 900;  //郑州to天津

    graph[1][3] = 300;  //天津to济南
    graph[3][1] = 300;  //济南to天津

    graph[2][3] = 400;  //郑州to济南
    graph[3][2] = 400;  //济南to郑州

    graph[2][4] = 500;  //郑州to长沙
    graph[4][2] = 500;  //长沙to郑州

    graph[3][4] = 1300; //济南to长沙
    graph[4][3] = 1300; //长沙to济南

    graph[3][5] = 1400; //济南to海南
    graph[5][3] = 1400; //海南to济南

    graph[4][5] = 1500; //长沙to海南
    graph[5][4] = 1500; //海南to长沙

    // 计算北京到其他城市的最短距离
    vector<int> dist = Dijkstra(graph, 0);
    printf("From 北京 min dist: \n");
    for(int i = 0; i < n; i++){
        printf("dist[%d] = %d\n", i, dist[i]);
    }

    // 计算郑州到其他城市的最短距离
    dist = Dijkstra(graph, 2);
    printf("From 郑州 min dist: \n");
    for(int i = 0; i < n; i++){
        printf("dist[%d] = %d\n", i, dist[i]);
    }

    return 0;
}

运行结果:
运行结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值