Dijkstra算法用于一个点到图中任意一点的最短路径,Floyd算法用于连通图中任意点到任意点的最短路径。Floyd从算法来看就很简单暴力,时间复杂度O(n^3),中心思想就是比如0-2不经过任何中转点是没有路径的,那么假如中转点1后,就有0-1-2这条路径,Floyd体现的就是一种动态规划,不断加入中转点,再遍历图中所有点,检查是否有经过中转点后可取得更短的路径。同样,附上邻接矩阵实现的Floyd算法
#include<iostream>
#define MAX_VERTEX 100
#define INFINITE 65535
using namespace std;
//array
char vertex_infos[MAX_VERTEX];
int matrix[MAX_VERTEX][MAX_VERTEX];
int main(){
for(int i=0;i<MAX_VERTEX;i++){
vertex_infos[i]=0;
for(int j=0;j<MAX_VERTEX;j++){
matrix[i][j]=INFINITE;
matrix[i][j]=INFINITE;
}
}
cout<<"input vertex and side nums:";
int num_vertex;
int num_side;
cin>>num_vertex>>num_side;
cout<<"input vertex char data:";
for(int i=0;i<num_vertex;i++){
cin>>vertex_infos[i];
}
for(int i=0;i<num_side;i++){
int v1;
int v2;
int weight;
cout<<"input two vertex:";
cin>>v1>>v2;
cout<<"input weight:";
cin>>weight;
matrix[v1][v2]=weight;
matrix[v2][v1]=weight;
}
for(int k=1;k<num_vertex;k++){
for(int i=0;i<num_vertex;i++){
for(int j=0;j<num_vertex;j++){
if(i!=j&&matrix[i][k]+matrix[k][j]<matrix[i][j]){
matrix[i][j]=matrix[i][k]+matrix[k][j];
}
}
}
}
for(int i=0;i<num_vertex;i++){
for(int j=0;j<num_vertex;j++){
cout<<matrix[i][j]<<' ';
}
cout<<endl;
}
return 0;
}