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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现