迪杰斯特拉算法(Dijkstra)

迪杰斯特拉算法(Dijkstra)
在这里插入图片描述样例示范

#include <iostream>
#include <vector>
#include <cstdio>
#define INF 99999999  //路径最大值
//迪杰斯特拉算法(Dijkstra):单源最短路径

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++){//更新最短路径的循环
        int min_dist=INF;//存储从起点到其他未访问节点的最短距离
        int middle=0;//存储最短距离节点的编号

        //遍历n个节点,寻找未被访问节点的距离起始顶点的节点编号
        for(int j=0;j<n;j++){
            //如果visit[j]==0,说明顶点j未被访问 且min_dist>dist[j]
            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的距离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()
{
    //0:北京,1:天津,2:郑州,3:济南,4:长沙,5:海南
    vector<vector<int> >graph;//样例抽象的图的邻接矩阵
    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);//初始化全部路径为INF
        }
        graph[i][i]=0;//自己到自己距离为0
    }

    graph[0][1]=100;
    graph[1][0]=100;

    graph[0][2]=1200;
    graph[2][0]=1200;

    graph[1][2]=900;
    graph[2][1]=900;

    graph[1][3]=300;
    graph[3][1]=300;

    graph[2][3]=400;
    graph[3][2]=400;

    graph[2][4]=100;
    graph[4][2]=100;

    graph[3][4]=1300;
    graph[4][3]=1300;

    graph[3][5]=1400;
    graph[5][3]=1400;

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

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

    return 0;
}

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值