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 @   Kazuma_124  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示