求图的最短路径,是一种常考算法。通常有两种算法:可以参考下面的博客:
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]。