Dijkstra
是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。权值为非负,贪心策略。
关键代码
vector<int> Dijkstra(vector<vector<int>> matrix,int s) { //matrix邻接矩阵,s源点
int n = matrix.size(); //节点总数
vector<int> dis(n,INF); //distance记录最短路径长度,初始值无穷大(自定义常量)
vector<int> par(n,-1); //parent记录路径,初始值-1
vector<int> vis(n,0); //visited记录是否访问过,初始值为0
dis[s] = 0; //设源点的距离为0
int k = s; //k变量是当前访问的节点,初始为源点
for (int i = 0; i < n; i++) { //一次计算一个节点,循环n次
vis[k] = 1; //将当前访问中的节点设为已访问过
for (int j = 0; j < n; j++) { //循环与当前节点相连的节点,更新距离值
if (vis[j] == 0 && dis[k] + matrix[k][j] < dis[j]) { //如果节点j没有被访问过且经过k再到j的距离小于直接到j的距离时
dis[j] = dis[k] + matrix[k][j]; //更新到达j点的距离
par[j] = k; //更新路径
}
}
k = s;
for (int j = 0; j < n; j++) { //扫描距离信息找到所有未选节点中距离最小的那个节点
if (vis[j] == 0) { //判断是否访问过
if (dis[j] < dis[k] || k == s) { //k==s证明第一次进入循环,k被赋值为第一次找到的未访问节点,或者找到距离最小的节点
k = j; //最后得到距离最小节点进入下一次循环
}
}
}
}
return par;
}
得到路径数组后,查询路径要从终点开始向起点推