1 #include<stdio.h> 2 #include<stdlib.h> 3 #define OK 1 4 #define TRUE 1 5 #define FALSE 0 6 #define ERROR -1 7 #define OVERFLOW -2 8 #define INFINITY 65535 9 #define MAX_VERTEX_NUM 10 10 typedef int Status; 11 typedef char TreeType; 12 int P[MAX_VERTEX_NUM];//用于存放最短路径,P[i]存放i的前驱结点序号 13 int D[MAX_VERTEX_NUM];//用于存放当前所求最短路径 14 //定义邻接矩阵数据结构 15 typedef struct 16 { 17 TreeType vexs[MAX_VERTEX_NUM]; 18 int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; 19 int vexnum,arcnum; 20 }MGraph; 21 Status CreateMGraph(MGraph &G)//构造一个图型存储结构 22 { 23 int i,j,k; 24 puts("请输入构成图的顶点个数和边数:"); 25 scanf("%d%d%*c",&G.vexnum,&G.arcnum); 26 puts("请输入顶点数值:"); 27 for(i=0;i<G.vexnum;i++) 28 scanf("%c",&G.vexs[i]); 29 for(i=0;i<G.vexnum;i++) 30 for(j=0;j<G.vexnum;j++) 31 if(i==j) G.arc[i][j]=0; 32 else G.arc[i][j]=INFINITY; 33 puts("请依次输入边(Vi,Vj)的顶点序号及权值:"); 34 for(k=0;k<G.arcnum;k++) 35 { 36 scanf("%d%d",&i,&j); 37 scanf("%d",&G.arc[i][j]); 38 G.arc[j][i]=G.arc[i][j]; 39 } 40 return OK; 41 } 42 Status ShortPath_Dijkstra(MGraph G,int v0) 43 { 44 int v,w,k,min; 45 int final[MAX_VERTEX_NUM]; 46 for(v=0;v<G.vexnum;v++) 47 { 48 final[v]=0; 49 D[v]=G.arc[v0][v]; 50 P[v]=0; 51 } 52 D[v0]=0; 53 final[v0]=1; 54 for(v=1;v<G.vexnum;v++) 55 { 56 min=INFINITY; 57 for(w=0;w<G.vexnum;w++) 58 { 59 if(!final[w]&&D[w]<min) 60 { 61 k=w; 62 min=D[w]; 63 } 64 } 65 final[k]=1; 66 for(w=0;w<G.vexnum;w++) 67 { 68 if(!final[w]&&(min+G.arc[k][w]<D[w])) 69 { 70 D[w]=min+G.arc[k][w]; 71 P[w]=k; 72 } 73 } 74 } 75 return OK; 76 } 77 //主函数 78 Status main() 79 { 80 MGraph G; 81 int i,j,k,v0; 82 TreeType Pathvex[MAX_VERTEX_NUM]; 83 CreateMGraph(G); 84 printf("请输入你要求的最短路径的起点序号:"); 85 scanf("%d",&v0); 86 ShortPath_Dijkstra(G,v0); 87 for(i=0;i<G.vexnum;++i) 88 { 89 if(i==v0) continue; 90 printf("从到%c到%c的最短路径为:",G.vexs[v0],G.vexs[i]); 91 for(k=0,j=i;j!=v0;j=P[j]) 92 Pathvex[k++]=G.vexs[j]; 93 Pathvex[k++]=G.vexs[v0]; 94 while(k) 95 printf("%c ",Pathvex[--k]); 96 printf("\n最短路径长度为:%d\n\n",D[i]); 97 } 98 system("pause"); 99 return OK; 100 }
相关文章: