相比Dijkstra,弗洛伊德算法在理解上真的太友好了!!
有一点要注意:由于该算法时间复杂度比较大(n的立方),因此只能用来解决n的顶点数为200以内的问题,显然用邻接矩阵更方便
例题:迪杰斯特拉算法应用1——输出所有顶点的最短距离
(在输入上唯一不同是不需要输入起始顶点编号)
代码:
#include <stdio.h>
#include <algorithm>
using namespace std;
const int INF = 100000000;
const int maxn = 200; //最大顶点数为200
int n,m;
int dis[maxn][maxn]; //二维数组dis[i][j]表示顶点i和顶点j的最短距离
void Floyed(){
for(int k = 0;k <n;k++){
for(int i = 0;i <n;i++){
for(int j = 0;j <n;j++){
if(dis[i][k] != INF && dis[k][j] != INF && dis[i][k] + dis[k][j] <dis[i][j]){
dis[i][j] = dis[i][k] + dis[k][j];
}
}
}
}
}
int main(){
int u,v,w;
fill(dis[0],dis[0]+maxn*maxn,INF);
scanf("%d%d",&n,&m);
for(int i = 0;i <n;i++){
dis[i][i] = 0;
}
for(int i = 0;i <m;i++){
scanf("%d%d%d",&u,&v,&w);
dis[u][v] = w;
}
Floyed();
for(int i = 0;i <n;i++){
for(int j = 0;j <n;j++){
printf("%d ",dis[i][j]);
}
printf("\n");
}
return 0;
}
/*
6 8
0 1 1
0 3 4
0 4 4
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3
*/