Floyd算法的基本过程不多赘述,此代码适合初学者,通俗易懂,都是博主自己一点一点敲的,没有看网上的事例,所以需要改进的地方肯定还有很多,不过对于初学者来说是个很好的熟悉Floyd算法的例子,下面贴代码~~(宝宝连做带写加改bug敲了3小时……)
#include<limits.h>
#include<iostream>
using namespace std;
int i=0,j=0,k=0;
/*
二维数组b=d[i][j]表示从i到j的最短路径为b
二维数组a=r[i][j]表示i的后继结点为a
*/
void Floyd(double w[][100],int n){
//初始化
double d[100][100]={0.0};
int r[100][100]={0};
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
d[i][j]=w[i][j];
if(i==j){
r[i][j]=-1;
}else{
r[i][j]=j;
}
}
}
//动态规划思想求D(0)到D(n)和R(0)到R(n)
for(k=1;k<=n;k++){
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(i!=j){
if(d[i][j]>d[i][k]+d[k][j]){
d[i][j]=d[i][k]+d[k][j];
r[i][j]=r[i][k];
}
}
}
}
cout<<endl;
}
//输出数组w,d,r
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
cout<<w[i][j]<<" ";
if(j%n==0){
cout<<endl;
}
}
}
cout<<endl;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
cout<<d[i][j]<<" ";
if(j%n==0){
cout<<endl;
}
}
}
cout<<endl;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
cout<<r[i][j]<<" ";
if(j%n==0){
cout<<endl;
}
}
}
cout<<endl;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(i!=j){
cout<<"the shortest distance from "<<i<<" to "<<j<<" is "<<d[i][j]<<endl;
cout<<"the route from "<<i<<" to "<<j<<" is "<<endl;
k=i;
while(k!=-1){
cout<<k<<" ";
k=r[k][j];
}
}
cout<<endl;
}
}
}
//test
int main(){
int n=5;
double w1[100][100]={0.0};
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(!(i==j)){
w1[i][j]=INT_MAX;
}
}
}
w1[1][2]=5;
w1[2][3]=6;w1[2][5]=-3;
w1[3][5]=2;
w1[4][1]=4;w1[4][3]=8;
w1[5][1]=4;w1[5][4]=-2;
Floyd(w1,n);
return 0;
}
运行结果:
有不明白的地方问博主哇,博主人很nice的~~