求圖的最短路徑,是一種常考算法。通常有兩種算法:可以參考下面的博客:
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
總結:floyd算法的本質是初始化距離矩陣,然后我們不斷去更新這個矩陣。策略是:如果從i到k,再從k到j的距離小於從i到j的距離,那么我們就更新matrix[i][j]=matrix[i][k]+matrix[k][j]。