sf
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 }