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 }

 

posted @ 2016-01-04 01:45  指间ゝ繁华初逝的格调  阅读(274)  评论(0编辑  收藏  举报