最短路徑——迪傑斯特拉和弗洛伊德算法


求圖的最短路徑,是一種常考算法。通常有兩種算法:可以參考下面的博客:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM