题目:
输入:
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
输出:
0 2 5 4
9 0 3 4
6 8 0 1
5 7 10 0
弗洛伊德核心公式:
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
}
}
思路:
弗洛伊德算法用来求任意两点之间的最短距离,也就是多元路径问题,当解决这种问题时我们必须要引入第三个,甚至第四个、第五个…才能达到缩短距离的目的。比如求a->b的最短距离,我们需要引入其他顶点,即a->i->b得距离最短。那么这个或者这几个点是哪个呢?所有点都是有可能的,所以我们需要依次尝试。
#include<iostream>
#include<sstream>
using namespace std;
int main(){
int map[10][10],n,m,x,y,t;
int inf=999999999;//定义无穷,表示两点之间不可达
cin>>n>>m;//n表示顶点数,m表示边的条数
for(int i=1;i<=n;i++){ //初始化地图
for(int j=1;j<=n;j++){
if(i==j) map[i][j]=0;
else map[i][j]=inf;
}
}
for(int i=1;i<=m;i++){ //输入地图
cin>>x>>y>>t;
map[x][y]=t;
}
for(int k=1;k<=n;k++){ //弗洛伊德核心算法
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
}
}
for(int i=1;i<=n;i++){ //打印最短路径地图
for(int j=1;j<=n;j++){
cout<<map[i][j]<<" ";
}
cout<<endl;
}
}