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

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

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]。

 

posted @ 2020-05-02 20:58  少年π  阅读(1112)  评论(0编辑  收藏  举报