zoukankan      html  css  js  c++  java
  • 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
    ", 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
    ", dist[a][b]);    //输出最短距离
    116     printf("The way is ");
    117     show_route(a, b);        //输出最短路径
    118     printf("
    ");
    119     //printf("%d
    ", INF);
    120     return 0;
    121 }
  • 相关阅读:
    JSOI2018 战争(凸包+闵可夫斯基和)
    树结构
    Emacs奇技淫巧
    概率期望
    动态DP
    无旋treap大法好
    玩NOILinux
    <虚树+树型DP> HNOI2014世界树
    <虚树+树型DP> SDOI2011消耗战
    日志系统升级之路(.Net客户端的使用)
  • 原文地址:https://www.cnblogs.com/minmsy/p/5097586.html
Copyright © 2011-2022 走看看