Floyd算法是求最短路径类题目中编码复杂度最低的算法,可以说是最简单的算法了,哈哈哈
输入样例:
4 8
1 2 2
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 3 12
#include<iostream>
using namespace std;
int main(){
int e[10][10],k,i,j,n,m,t1,t2,t3;
//用inf存储一个无穷大的值
int inf=999999;
//读入顶点个数和边的条数
cin>>n>>m;
//初始化
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(i==j){
e[i][j]=0;
}else{
//若两个点之间无法直接到达,则定义为无穷大
e[i][j]=inf;
}
}
}
//读入边
for(i=1;i<=m;i++){
//t1,t2分别表示两个点,t3表示他们之间的距离
cin>>t1>>t2>>t3;
e[t1][t2]=t3;
}
//Floyd算法核心语句
for(k=1;k<=n;k++){
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
//从第k号顶点中转,若比原来的值小,则更新他
//实际上Floyd就是枚举了所有可能中转的方式,计算出任意两点间的最短距离
if(e[i][j]>e[i][k]+e[k][j]){
e[i][j]=e[i][k]+e[k][j];
}
}
}
}
//输出最终结果
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
cout<<e[i][j]<<" ";
}
cout<<"\n";
}
return 0;
}
输出样例
0 2 5 4
9 0 3 4
6 8 0 1
5 7 10 0
尽管Floyd算法实现起来十分容易,但是他的时间复杂度十分高,若要处理数据量比较大的数据,就不太适用了,它还无法解决“负权回路”的问题,因为“负权回路”没有最短路径,它每走一次,最短路径减1