zoukankan      html  css  js  c++  java
  • 佛洛依德 c++ 最短路径算法

      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 }
  • 相关阅读:
    AD20改变pcb图纸大小方式
    ceph相关概念
    五种IO模型和三种实现方式
    MongoDB入门
    GO通过sqlx库操作MySQL
    Go原生sql操作MySQL
    Traefik工作原理
    Redis主从
    Nginx入门
    Redis入门
  • 原文地址:https://www.cnblogs.com/sanzangtdashi/p/5647426.html
Copyright © 2011-2022 走看看