自己对伪代码的实现:
#include <iostream>
using namespace std;
const int mvnum=100;
#define MaxInt 32767
typedef int VexType;
typedef int EdgeType;
typedef struct Graph{
VexType vertex[mvnum];
EdgeType edge[mvnum][mvnum];
int vexnum,edgenum;
}Graph;
void CreateGraph(Graph &G);
int LocateVex(Graph &G,VexType v);
void Dijkstra(Graph &G,int start);
int findMinDist(int dist[],int s[],int num);
void display(int dist[],int path[],int start,int num);
void CreateGraph(Graph &G){
cin>>G.vexnum>>G.edgenum;
for(int i=0;i<G.vexnum;++i){
cin>>G.vertex[i];
}
for(int i=0;i<G.vexnum;++i){
for(int j=0;j<G.vexnum;++j){
G.edge[i][j]=MaxInt;
}
}
for(int k=0;k<G.edgenum;++k){
VexType v1,v2;
EdgeType w;
cin>>v1>>v2>>w;
int i=LocateVex(G,v1);
int j=LocateVex(G,v2);
G.edge[i][j]=w;
//G.edge[j][i]=G.edge[i][j];
}
}
int LocateVex(Graph &G,VexType v){
for(int i=0;i<G.vexnum;++i){
if(v==G.vertex[i]) return i;
}
return -1;
}
void Dijkstra(Graph &G,int start){
int dist[G.vexnum],path[G.vexnum];//dist数组代表起点到各点最短路径,path数组代表是谁到达该点
for(int i=0;i<G.vexnum;++i){
dist[i]=G.edge[start][i];//dist数组先获取起点直接到各点的距离
if(dist[i]!=MaxInt) path[i]=start;//如果不是无穷大,则起点可以到达该点 ,且此时到达该点的最短点就是起点
else path[i]=-1;
}
int s[G.vexnum];
for(int i=0;i<G.vexnum;++i){
s[i]=0;
}
s[start]=1;//归入集合
int num=1;
while(num<G.vexnum){
int min=findMinDist(dist,s,G.vexnum);//在dist中查找s[i]==0的最小值元素
s[min]=1;//归入集合
for(int i=0;i<G.vexnum;++i){
if(s[i]==0&&dist[i]>dist[min]+G.edge[min][i]){
dist[i]=dist[min]+G.edge[min][i];
path[i]=min;
}
}
num++;
}
display(dist,path,start,G.vexnum);
}
int findMinDist(int dist[],int s[],int num){
int min=MaxInt,min_index=0;
for(int i=1;i<num;++i){
if(s[i]==0&&min>dist[i]){
min=dist[i];
min_index=i;
}
}
return min_index;
}
void display(int dist[],int path[],int start,int num){
int array[num-1]={0};
array[num-2]=num-1;
int i=num-1;int flag=3;
while(path[i]!=0){
array[num-flag]=path[i];flag++;
i=path[i];
}
cout<<"最短路径:";
for(int i=0;i<num-1;++i){
cout<<array[i]<<" ";
}
cout<<"\n路径长度:"<<dist[num-1]<<endl;
}
int main(){
Graph g;
CreateGraph(g);
Dijkstra(g,0);
return 0 ;
}