1 #include <stdio.h>
2 #include <time.h>
3 #include <stdlib.h>
4
5 #define MAXN 150 //最大节点数
6 #define INF ((1<<31)-1) //无穷大数
7
8 int dist[MAXN][MAXN]; //记录两节点之间的距离
9 int parent[MAXN][MAXN]; //记录节点a到b路径中b的父节点
10
11 double random_d() //生成0~1间的随机数
12 {
13 return (double)rand()/RAND_MAX;
14 }
15
16 int random_i(int m) //生成0~m间的随机数
17 {
18 return (int)(random_d()*(m-1) + 0.5);
19 }
20
21 void initial(int n) //初始化dist数组和parent数组
22 {
23 int a, b;
24 for(a = 0; a < n; a++)
25 {
26 for(b = 0; b < n; b++)
27 {
28 if(a != b)
29 {
30 dist[a][b] = INF; //初始阶段距离未知暂时定为无穷大
31 parent[a][b] = -1;
32 }else{ //此时a等于b
33 dist[a][b] = 0; //节点a到节点a自身的距离是0
34 parent[a][b] = a;
35 }
36 }
37 }
38 }
39
40 void floyd(int n) //floyd算法,计算两点之间的最短距离
41 {
42 int a, b, k;
43 for(k=0; k<n; k++)
44 {
45 for(a=0; a < n; a++)
46 {
47 for(b = 0; b < n; b++)
48 {
49 if(dist[a][k] == INF || dist[k][b] == INF) continue;
50 if(dist[a][b] > dist[a][k] + dist[k][b])
51 {
52 dist[a][b] = dist[a][k] + dist[k][b];
53 parent[a][b] = parent[k][b];
54 }
55 }
56 }
57 }
58 }
59
60 void generate_graph(int n) //随机生成一张连通图
61 {
62 int i, j, v;
63 initial(n); //进行初始化
64 for(i = 1; i<n; i++) //保证连通性,让0号节点与其他所有点相连
65 {
66 dist[0][i] = dist[i][0] = random_i(100) + 100; //保证算法起作用,加大权值
67 parent[0][i] = 0;
68 parent[i][0] = i;
69 }
70 for(i=1; i<n; i++ )
71 {
72 for(j=i+1; j<n; j++)
73 {
74 v = random_i(100) ; //随机生成权值
75 if(v != 0)
76 {
77 dist[i][j] = dist[j][i] = v;
78 parent[i][j] = i;
79 parent[j][i] = j;
80 }
81 }
82 }
83 }
84
85 void show_graph(int n) //展示节点之间的连接关系及对应的权值
86 {
87 int i, j;
88 for(i=0; i<n; i++)
89 {
90 for(j=i+1; j<n; j++)
91 if(dist[i][j] != INF) printf("Direct distance between %d and %d: %d\n", i, j, dist[i][j]);
92 }
93 }
94
95 void show_route(int a, int b) //显示a到b的距离最短的路径
96 {
97 if(a == b){
98 printf("%d", b);
99 }else{
100 show_route(a, parent[a][b]);
101 printf("-%d", b);
102 }
103 }
104
105 int main()
106 {
107 int a, b;
108 srand(time(NULL)); //初始化随机数发生器种子
109
110 generate_graph(100); //随机生成一张连通图
111 show_graph(100); //展示节点之间的连接关系及对应的权值
112 floyd(100); //floyd算法,计算两点之间的最短距离
113 printf("Please input starting point and end point: "); //提示用户输入两个节点,两个输入之间用逗号隔开,并保证节点编号小于100
114 scanf("%d %d", &a, &b); //读取用户输入
115 printf("The distance is %d\n", dist[a][b]); //输出最短距离
116 printf("The way is ");
117 show_route(a, b); //输出最短路径
118 printf("\n");
119 //printf("%d\n", INF);
120 return 0;
121 }