迪杰斯特拉算法求最短路径 C++代码实现

#include<iostream> #include<string> using namespace std; /*邻接矩阵的类型定义*/ #define MAX 10000000 #define MAX_VERTEX_NUM 20 typedef struct { string vexs[MAX_VERTEX_NUM];//用一维数组存储顶点信息 int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//用二维数组充当矩阵,来存储顶点边的信息 int vexnum,edgenum;//顶点树和边数 }MGraph; /*构造有向网的邻接矩阵*/ void CreateDN_AM(MGraph &G,int n,int e) { G.vexnum=n; G.edgenum=e; int i,j,k; int weight; for(i=0;i<n;i++) cin>>G.vexs[i];//输入顶点信息 for(i=0;i<n;i++) for(j=0;j<n;j++) G.edges[i][j]=MAX;//将矩阵初始化为MAX for(k=0;k<e;k++) { cin>>i>>j>>weight; G.edges[i][j]=weight; } } /*迪杰斯特拉算法求某个顶点到其余顶点的最短路径*/ void ShortestPath_DJ(MGraph &G,int v) { int i,j,k,min; int final[MAX_VERTEX_NUM];//该数组用来标识顶点是否已确定了最短路径 int dist[MAX_VERTEX_NUM]; string path[2*MAX_VERTEX_NUM]; for(i=0;i<G.vexnum;i++) {//初始化工作 dist[i]=G.edges[v][i];//dist数组用来存储当前找到的v到其他各顶点的最短路径 if(dist[i]<MAX) path[i]=G.vexs[v]+G.vexs[i];//如果v到i有边的话,把顶点字符存到path字符数组中,表示路径 else path[i]=""; final[i]=0;//初始化标识数组为0 } dist[v]=0; final[v]=1; for(j=1;j<G.vexnum;j++) { min=MAX; for(i=0;i<G.vexnum;i++) if(dist[i]<min && final[i]==0) { min=dist[i]; k=i; }//找到dist数组中最小值的位置k cout<<path[k]<<" "<<dist[k]<<endl;//输出最短路径 final[k]=1;//设置标志位 for(i=0;i<G.vexnum;i++) {//遍历每个顶点i和当前的已求出的最短路径的顶点k作比较,若从源点经过顶点k到顶点i的路径,比dist[i]小, //则更新顶点dist[i] if(dist[i]>dist[k]+G.edges[k][i] && final[i]==0) { dist[i]=dist[k]+G.edges[k][i]; path[i]=path[k]+G.vexs[i]; } }//从整体上来看就是算出k的邻接点的当前最短路径 } } void main() { freopen("in.txt","r",stdin); MGraph G; CreateDN_AM(G,7,11); ShortestPath_DJ(G,0); } 

迪杰斯特拉算法主要是采用了一个dist一维数组,来存储源点到其它顶点的最短路径,然后不断更新。

你可能感兴趣的:(迪杰斯特拉算法求最短路径 C++代码实现)