1 //20142880 唐炳辉 石家庄铁道大学
2 #include<iostream>
3 #include<string>
4 using namespace std;
5 #define Maxnum 32767
6 #define N 100
7
8
9
10 typedef struct
11 {
12 string Dianarr[N];
13 string info[N];
14 int arcs[N][N];
15 int DianNum,BianNum;
16 }FloydStruct;
17
18 int LocateVex(FloydStruct G, string a)
19 {
20 int i;
21 bool flag = 0;
22 for(i = 0;i < G.DianNum;i++)
23 if(a == G.Dianarr[i])
24 {
25 flag = 1;
26 return i;
27 }
28 if(flag == 0)
29 {
30 return -1;
31 }
32 }
33 void CreateUDN(FloydStruct &G)
34 {
35 cout << "请输入顶点数和边数:" << endl;
36 cin >> G.DianNum >> G.BianNum;
37 cout << "请输入顶点信息:" << endl;
38 for(int i = 0;i<G.DianNum;i++)
39 cin >> G.Dianarr[i];
40 for(int i = 0;i<G.DianNum;i++)
41 for(int j = 0;j<G.DianNum;j++)
42 G.arcs[i][j] = Maxnum;
43 string v1,v2;
44 int w,i,j;
45 cout << "请输入存在路径的两个顶点和路径长度:" << endl;
46 for(int k = 0;k<G.BianNum;k++)
47 {
48 cin >> v1 >> v2 >> w;
49 i = LocateVex(G,v1);//获取点的数组下标
50 j = LocateVex(G,v2);
51 G.arcs[i][j] = w;//权值赋值给两点
52 }
53 }
54
55
56 int Path[N][N];
57 int D[N][N];
58 void Floyd(FloydStruct G) //佛洛依德
59 {
60 for(int i = 0;i < G.DianNum;i++)
61 for(int j = 0; j < G.DianNum;j++)
62 {
63 D[i][j] = G.arcs[i][j];
64 if(D[i][j]<Maxnum)
65 Path[i][j] = i;
66 else
67 Path[i][j] = -1;
68 }
69 for(int k = 0;k < G.DianNum;k++)/**核心**/
70 for(int i = 0; i < G.DianNum;i++)
71 for(int j = 0; j < G.DianNum;j++)
72 if(D[i][k] + D[k][j] < D[i][j])
73 {
74 D[i][j] = D[i][k] + D[k][j];
75 Path[i][j] = Path[k][j];
76 }
77 }
78
79 void printFl(FloydStruct G) //输出
80 {
81 /*string a,b;
82 int i,j,font = 1;
83 cout << "请输入当前位置和要去位置:" << endl;
84 cin >> a >> b;
85 //显示最短路径
86
87
88 i = LocateVex(G,a);
89 j = LocateVex(G,b);
90 if(D[i][j]==Maxnum)
91 cout << "最短距离为:" << "不可达!"<< endl;
92 else
93 cout << "最短距离为:" << D[i][j]<< endl;*/
94 for(int i=0;i<G.DianNum;i++)
95 {
96 for(int j=i+1;j<G.DianNum;j++)
97 {
98
99
100
101 if(D[i][j]!=Maxnum)
102 {int q =0;
103
104 int j1=j;
105 int a[20]={100};
106 while(1)
107 {
108
109 if(Path[i][j1]!=i)
110 {
111
112
113 a[q]=j1=Path[i][j1];
114
115 q=q++;
116
117
118 }
119 else
120 {
121 break;}
122 }
123
124 cout<<G.Dianarr[i]<<"------>";
125 for(int p=q-1;p>=0;p--)
126 {
127 cout<<G.Dianarr[a[p]]<<"------>";
128 }
129 cout<<G.Dianarr[j]<< D[i][j]<< endl;
130 }
131 }
132
133 }
134 //temp终点
135
136 }
137
138 void main()
139 {
140 FloydStruct G;
141 CreateUDN(G);//生成邻接矩阵
142 Floyd(G);
143 printFl(G);
144 }