C++,求单源最短路的Dijkstra算法

请编写程序,实现在带权的有向图中求单源最短路的 Dijkstra 算法。
注意:当多个待收录顶点路径等长时,按编号升序进行收录。

输入格式:

输入首先在第一行给出两个正整数,依次为当前要创建的图的顶点数 n(≤100)和边数 m
随后 m 行,每行给出一条有向边的起点编号、终点编号、权重。顶点编号从 0 开始,权重(≤100)为整数。同行数字均以一个空格分隔。

输出格式:

参考样例。按顶点编号的升序,每行输出一个顶点的信息,格式为:

v[i]: dist=x, path=y

其中 i 为顶点编号;x 为顶点 0 到顶点 i 的最短距离;y 为对应的最短路径上,i 的前驱顶点编号。因为起点 0 没有前驱顶点,所以对应的 y 记为 -1

输入样例:

6 9
0 1 1
0 2 12
1 2 9
1 3 3
2 4 5
3 2 4
3 4 13
3 5 15
4 5 4

输出样例:

v[0]: dist=0, path=-1
v[1]: dist=1, path=0
v[2]: dist=8, path=3
v[3]: dist=4, path=1
v[4]: dist=13, path=2
v[5]: dist=17, path=4

代码

#include <iostream>
#include <vector>


int main(){
    const int NoEdge = 101;
    const int INF = 100000;
    int n,m;
    std::cin>>n>>m;
    std::vector<std::vector<int>> graph(n,std::vector<int>(n,NoEdge));
    for(int i = 0;i<m;i++){
        int start,end,weight;
        std::cin>>start>>end>>weight;
        graph[start][end] = weight;
    }
    std::vector<int> minDistToI(n,INF);
    std::vector<int> preVertex(n,-1);
    std::vector<bool> isVisited(n,false);
    minDistToI[0]=0;
    bool flag = true;
    
    while(flag){
        int minDistToMark = INF;
        int minIndex = -1;
        for(int i = 0;i<n;i++){
            if(minDistToI[i]<minDistToMark && isVisited[i]==false){
                minDistToMark = minDistToI[i];
                minIndex = i;
            }
        }
        if(minIndex == -1 || minDistToMark == INF){
            flag = false;
        }else{
            for(int i = 0;i<n;i++){
                if(graph[minIndex][i]!=NoEdge && minDistToI[minIndex]+graph[minIndex][i]<minDistToI[i]){
                    //更新最短距离
                    minDistToI[i] = minDistToI[minIndex]+graph[minIndex][i];
                    preVertex[i] = minIndex;
                }
            }
            isVisited[minIndex] = true;
        }
    }
    for(int i = 0;i<n;i++){
        std::cout<<"v["<<i<<"]: dist="<< minDistToI[i] << ", path=" << preVertex[i]<<std::endl;
    }
    return 0;
}

posted @ 2025-01-02 18:51  Kazuma_124  阅读(50)  评论(0)    收藏  举报