计算北京到其它各城市的最短距离
//最短路径Dijkstra算法
#include<iostream>
#include<vector>
#include<cstdio>
#define INF 99999999 //路径的最大值
using namespace std;
/*
graph 图的邻接矩阵
start 起始顶点编号
返回值:返回一个一维向量 存储起始顶点到其它顶点的最短路径
*/
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说明未被访问过,且min_dist > dist[j] 时
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 的距离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;
}
graph[0][1] = 100;
graph[1][0] = 100;
graph[0][2] = 1200;
graph[2][0] = 1200;
graph[1][2] = 900;
graph[2][1] = 900;
graph[1][3] = 300;
graph[3][1] = 300;
graph[2][3] = 400;
graph[3][2] = 400;
graph[2][4] = 500;
graph[4][2] = 500;
graph[3][4] = 1300;
graph[4][3] = 1300;
graph[3][5] = 1400;
graph[5][3] = 1400;
graph[4][5] = 1500;
graph[5][4] = 1500;
//计算北京到其它城市的最短距离
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]);
}
return 0;
}
结果:
以下为北京到各城市最短路径经过的城市序列
0-0
0-1
0-1-3-2
0-1-3
0-1-3-2-4
0-1-3-5