• 最短路径——迪杰斯特拉和弗洛伊德算法


    求图的最短路径,是一种常考算法。通常有两种算法:可以参考下面的博客:

    https://blog.51cto.com/gelivable/427009

    https://blog.csdn.net/zxq2574043697/article/details/9451887

    关于迪杰斯特拉算法:

     

     总结:迪杰斯特拉算法:是求某个点到其他所有点的最短路径,最终得到的是一个距离集合

    2:floyd算法

    floyd算法求解的是图中任意两点的最短距离,其得到的是一个距离矩阵:

    代码:

     1 #include<iostream>  
     2 #define MAX_VERTEX 100  
     3 #define INFINITE 65535  
     4 using namespace std;
     5 //array   
     6 
     7 char vertex_infos[MAX_VERTEX];  
     8 int matrix[MAX_VERTEX][MAX_VERTEX];
     9 int main(){
    10     for(int i=0;i<MAX_VERTEX;i++){   
    11         vertex_infos[i]=0;  
    12         for(int j=0;j<MAX_VERTEX;j++){   
    13             matrix[i][j]=INFINITE;   
    14             matrix[i][j]=INFINITE;   
    15         }
    16     }  
    17        
    18     cout<<"input vertex and side nums:";   
    19     int num_vertex;   
    20     int num_side;   
    21     cin>>num_vertex>>num_side;   
    22        
    23     cout<<"input vertex char data:";   
    24     for(int i=0;i<num_vertex;i++){   
    25         cin>>vertex_infos[i];   
    26     }   
    27        
    28     for(int i=0;i<num_side;i++){   
    29         int v1;   
    30         int v2;   
    31         int weight;  
    32         cout<<"input two vertex:";   
    33         cin>>v1>>v2;   
    34         cout<<"input weight:";   
    35         cin>>weight;   
    36         matrix[v1][v2]=weight;  
    37         matrix[v2][v1]=weight;  
    38     }
    39     cout<<"initial:"<<endl;
    40         for(int i=0;i<num_vertex;i++){   
    41         for(int j=0;j<num_vertex;j++){
    42             cout<<matrix[i][j]<<' ';
    43         }
    44         cout<<endl;
    45     }
    46     for(int k=1;k<num_vertex;k++){
    47         for(int i=0;i<num_vertex;i++){
    48             for(int j=0;j<num_vertex;j++){
    49                 if(i!=j&&matrix[i][k]+matrix[k][j]<matrix[i][j]){
    50                     matrix[i][j]=matrix[i][k]+matrix[k][j];
    51                 }
    52             }
    53         }
    54     }
    55     
    56     cout<<"floyd:"<<endl;
    57     for(int i=0;i<num_vertex;i++){   
    58         for(int j=0;j<num_vertex;j++){
    59             cout<<matrix[i][j]<<' ';
    60         }
    61         cout<<endl;
    62     }  
    63     system("pause");
    64     return 0;
    65 }

    上图中46-50行就是floyd算法的核心代码部分:matrix[i][j]表示节点i到节点j的最短距离

    关于floyd算法最通俗的两个描述博客:

    https://www.cnblogs.com/wangyuliang/p/9216365.html

    https://blog.csdn.net/qq_35644234/article/details/60875818?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3

    总结:floyd算法的本质是初始化距离矩阵,然后我们不断去更新这个矩阵。策略是:如果从i到k,再从k到j的距离小于从i到j的距离,那么我们就更新matrix[i][j]=matrix[i][k]+matrix[k][j]。

     

  • 相关阅读:
    产品设计理应遵循哪些原则?
    产品经理必读的九步法
    exec
    Class convert
    Connecting method
    ASP.NET读写操作
    Encrypt Decrypt
    EventHandler, EventArgs
    Convert using code
    Dictionary List
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/12819503.html
Copyright © 2020-2023  润新知