描述:如上图所示,求出北京到各个顶点的最短路径。
代码实现:
#include <stdio.h>
#include <vector>
#define INF 99999999 // 路径的最大值
using namespace std;
vector<int> Dijkstra(vector<vector<int>> &graph, int start){
int n = graph.size(); // 存储图中的顶点个数
vector<int> visit(n,0); // 标记已作为中间节点完成访问的顶点
vector<int> dist(n,0); // 存储从起点start到其他顶点的最短路径
for(int i =0; i < n; i++){
dist[i] = graph[start][i]; // 将dist数组初始化为最初图中的路径长度
}
visit[start] = 1; // 标记起始顶点
for(int i = 0; i < n; i++){ // 更新最短路径的循环,循环进行n次
int min_dist = INF; // 存储从起点到其他未被访问节点中的最短距离
int middle = 0; // 存储最短距离节点的编号
// 遍历n个顶点,寻找当前未被访问的顶点中的距离起始顶点的最短距离的节点编号
for(int j = 0; j < n; j++){
// 如果visit[j] == 0, 说明顶点j未被访问,且mid_dist > dist
if(visit[j] == 0 && min_dist > dist[j]){
min_dist = dist[j]; // 更新最短距离min_dist为dist[j]
middle = j; // 更新顶点编号middle为j
}
}
// 以middle为中间节点,再循环遍历其他所有节点
for(int j = 0; j < n; j++){
/* 如果当前遍历的节点j未曾作为过中间节点,并且
从起始节点到j的距离dist[j]大于从起始节点到middle
与从middle到j的距离和 */
if(visit[j] == 0 && dist[j] > dist[middle] + graph[middle][j]){
// 更新起始节点到j的距离dist[j], 更新为起始到middle与middle到j的距离和
dist[j] = dist[middle] + graph[middle][j];
}
}
visit[middle] = 1; // 将middle顶点设置为已访问
}
return dist; // 返回最短路径结果
}
int main(){
vector<vector<int>> graph; // 样例中对应的邻接矩阵
// 0 北京
// 1 天津
// 2 郑州
// 3 济南
// 4 长沙
// 5 海南
int n = 6;
for(int i = 0; i < n; i++){
graph.push_back(vector<int>());
for(int j = 0; j < n; j++){
graph[i].push_back(INF); // 初始化的全部路径为正无穷
}
graph[i][i] = 0; // 某城市至该城市本身的距离是0
}
graph[0][1] = 100; //北京to天津
graph[1][0] = 100; //天津to北京
graph[0][2] = 1200; //北京to郑州
graph[2][0] = 1200; //郑州to北京
graph[1][2] = 900; //天津to郑州
graph[2][1] = 900; //郑州to天津
graph[1][3] = 300; //天津to济南
graph[3][1] = 300; //济南to天津
graph[2][3] = 400; //郑州to济南
graph[3][2] = 400; //济南to郑州
graph[2][4] = 500; //郑州to长沙
graph[4][2] = 500; //长沙to郑州
graph[3][4] = 1300; //济南to长沙
graph[4][3] = 1300; //长沙to济南
graph[3][5] = 1400; //济南to海南
graph[5][3] = 1400; //海南to济南
graph[4][5] = 1500; //长沙to海南
graph[5][4] = 1500; //海南to长沙
// 计算北京到其他城市的最短距离
vector<int> dist = Dijkstra(graph, 0);
printf("From 北京 min dist: \n");
for(int i = 0; i < n; i++){
printf("dist[%d] = %d\n", i, dist[i]);
}
// 计算郑州到其他城市的最短距离
dist = Dijkstra(graph, 2);
printf("From 郑州 min dist: \n");
for(int i = 0; i < n; i++){
printf("dist[%d] = %d\n", i, dist[i]);
}
return 0;
}
运行结果: