C++实现Floyd算法
Floyd算法是计算任意两点之间最短路的一种算法。相比于Dijkstra和逐次逼近法来说最大的优点在于可以全局的计算任意两点间的最短路径。相关原理很多博主写的都非常好,这里就不再赘述。
此代码是在完成作业是不想手动计算,有些题目迭代次数有点多,矩阵又比较庞大,容易算错失去耐心,故随手写了代码帮我计算。贴在此处也好供日后复习。因此代码没有经过很好的优化,不足之处欢迎批评指正。
代码如下
#include<iostream>
#include <bits/stdc++.h>
using namespace std;
struct juzhen //存储每一次的迭代结果
{
int mix[7][7]; //自行修改数组长度,与length保持一致
};
int main()
{
int length;
cin>>length;
int mix1[length][length];
juzhen ju[10];
for(int i=0; i<length; i++)
{
for(int j=0; j<length; j++)
{
cin>>mix1[i][j];
ju[0].mix[i][j]=mix1[i][j]; //初始化
}
}
int Count=0;
int mid[length];
cout<<"-------------------------------------"<<endl;
while(Count<10) //最多迭代10次
{
for(int i=0; i<length; i++)
{
for(int k=0; k<length; k++)
{
for(int j=0; j<length; j++)
{
mid[j]=ju[Count].mix[i][j]+ju[Count].mix[j][k];
//cout<<mid[j]<<" ";
}
sort(mid,mid+length); //查找最短路径
cout<<mid[0]<<" ";
ju[Count+1].mix[i][k]=mid[0]; //存储迭代结果
}
cout<<endl;
}
cout<<endl;
int kk=0; //判断是否达到最短路径
for(int i=0;i<length;i++)
{
for(int j=0;j<length;j++)
{
if(ju[Count+1].mix[i][j]!=ju[Count].mix[i][j])
{
kk=1;
break;
}
}
if(kk==1) break;
}
if(kk==0)
{
cout<<"finish"<<endl;
for(int i=0;i<length;i++)
{
for(int j=0;j<length;j++)
{
cout<<ju[Count].mix[i][j]<<" ";
}
cout<<endl;
}
cout<<"Number of iterations is = "<<Count+1<<endl; //输出总迭代次数
break; //达到最优解,结束运算
}
Count++;
}
return 0;
}
示例: