迪杰斯特拉最短路径
以4 a b 1 b c 6 a c 6 a d 2 d c 7 b e 6 c e 4 c f 5 d f 1 f e 6 e g 8 f g构造有向图并找出最短路径
#include <stdio.h> #include <stdlib.h> #define MaxVertexNum 100 #define BIG 100 typedef char VertexType;//顶点节点的数据类型 typedef int EdgeType;//边权值的数据类型 typedef struct{ VertexType Vertex[MaxVertexNum];//顶点表 EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表 int vertexnum,arcnum;//顶点数和边数 }MGraph;//邻接矩阵的存储结构 int Locate(VertexType v){ if(v>=97){return (int)v-97;} else {return (int)v-65;} }//将顶点转换为相应的位置 typedef struct{ int vertex[MaxVertexNum]; int top; }Stack; void CreatGraph(MGraph &M){ EdgeType e; VertexType v1,v2; printf("输入节点数和边数:"); scanf("%d %d",&M.vertexnum,&M.arcnum); printf("输入节点:"); for(int i=0;i<M.vertexnum;i++){ getchar(); scanf("%c",&M.Vertex[i]); } for(int i=0;i<M.vertexnum;i++){ for(int j=0;j<M.vertexnum;j++){ M.Edge[i][j]=BIG; } } fflush(stdin);//清除缓存,防止下一次的scanf()函数失效 printf("输入路径的权值及其两个节点:\n"); for(int i=0;i<M.arcnum;i++){ scanf("%d %c %c",&e,&v1,&v2); M.Edge[Locate(v1)][Locate(v2)]=e; } }//构造一个有向图 void PrintGraph(MGraph &M){ printf("邻接矩阵\n"); for(int i=0;i<M.vertexnum;i++){ printf(" %c ",M.Vertex[i]); for(int j=0;j<M.vertexnum;j++){ if(M.Edge[i][j]!=BIG){ printf("%d ",M.Edge[i][j]); } else{printf("∞ ");} } printf("\n"); } }//打印邻接矩阵 void visited(int v){ printf("%c ",v+'a'); }//访问当前节点的位置 void Dijkstra(MGraph &M,VertexType a,int path[],int dist[]){ int v=Locate(a); int set[MaxVertexNum];//标记节点是否已并入最短路径中 int min,k; for(int i=0;i<M.vertexnum;i++){ dist[i]=M.Edge[v][i]; set[i]=0; if(M.Edge[v][i]!=BIG){ path[i]=v; } else path[i]=-1; } set[v]=1; for(int i=0;i<M.vertexnum-1;i++){ min=20; for(int j=0;j<M.vertexnum;j++){ if(set[j]==0&&dist[j]<min){ min=dist[j]; k=j; } } set[k]=1; for(int j=0;j<M.vertexnum;j++){ if(set[j]==0&&dist[k]+M.Edge[k][j]<dist[j]){ dist[j]=dist[k]+M.Edge[k][j]; path[j]=k; } } } for(int i=1;i<M.vertexnum;i++){ printf("a到%c的最短路径为:%d\n",i+'a',dist[i]); } } int main(){ MGraph M; CreatGraph(M); PrintGraph(M); int dist[MaxVertexNum];//记录已找到的最短路径 int path[M.vertexnum];//记录到vi的前一个顶点 Dijkstra(M,'a',path,dist); }