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 }