迪杰斯特拉算法
一. 概述
Dijkstra算法是求一个顶点到其余各顶点的最短路径算法-
迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略
每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止
二. 算法流程
- 建立图的存储结构(邻接矩阵/邻接表)
- 初始化图
- 初始化源点到各点路径长度
- 初始化当前访问顶点集合并将源点加入
- 贪心寻找下一个未入集合的最近节点
- 将该节点加入已经访问顶点集合
- 以该节点为媒介更新其他顶点距离(未访问)
- 重复567操作n-1次
- 返回结果
三. C++模板
vector<vector<int>> graph;//邻接矩阵
Graph(int n, vector<vector<int>>& edges) {//初始化图
graph.resize(n);
for(auto &point:graph)
point.resize(n,INT_MAX);//初始赋无穷远距离
for(int i=0;i<edges.size();i++){
int from = edges[i][0];
int to = edges[i][1];
int cost = edges[i][2];
graph[from][to] = cost;
}
}
void addEdge(vector<int> edge) {//加入边
int from = edge[0];
int to = edge[1];
int cost = edge[2];
graph[from][to] = cost;
}
获取起点到终点的最短路径长度
int shortestPath(int node1, int node2) {
int n = graph.size();
vector<bool> vis(n);
vector<int> dis(n,INT_MAX/2);
dis[node1] = 0;
for(int times=0;times<n;times++){//最多遍历n次
int cur = -1;
for(int i=0;i<n;i++){//贪心找最小值
if(vis[i]||dis[i]==INT_MAX/2) continue;//跳过已经选取的点和无法到达的点
if(cur==-1||dis[i]<dis[cur]) cur = i;
}
if(cur==-1) return -1;//表示无法到达目标
if(cur==node2) break; //找到目标直接跳出,此时dis[cur]即为最短路径,无需再更新
vis[cur] = 1;
//找到当前最近点后,根据最近点进行更新
for(int i=0;i<n;i++){
if(vis[i]||graph[cur][i]==INT_MAX/2) continue;//对应点已选取,或对应的边不存在,无需更新
dis[i] = min(dis[i],dis[cur]+graph[cur][i]);
}
}
return dis[node2]==INT_MAX/2?-1:dis[node2];
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本