迪杰斯特拉算法(Dijkstra)
样例示范
#include <iostream>
#include <vector>
#include <cstdio>
#define INF 99999999 //路径最大值
//迪杰斯特拉算法(Dijkstra):单源最短路径
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++){//更新最短路径的循环
int min_dist=INF;//存储从起点到其他未访问节点的最短距离
int middle=0;//存储最短距离节点的编号
//遍历n个节点,寻找未被访问节点的距离起始顶点的节点编号
for(int j=0;j<n;j++){
//如果visit[j]==0,说明顶点j未被访问 且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()
{
//0:北京,1:天津,2:郑州,3:济南,4:长沙,5:海南
vector<vector<int> >graph;//样例抽象的图的邻接矩阵
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);//初始化全部路径为INF
}
graph[i][i]=0;//自己到自己距离为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]=100;
graph[4][2]=100;
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);
cout<<"From Beijing min dist:"<<endl;
for(int i=0;i<n;i++){
printf("dist[%d]: %d\n",i,dist[i]);
}
//计算从郑州到其他城市的最短距离
dist = Dijkstra(graph,2);
cout<<"From ZhengZhou min dist:"<<endl;
for(int i=0;i<n;i++){
printf("dist[%d]: %d\n",i,dist[i]);
}
return 0;
}
运行结果