算法思路:先用矩阵e[10][10]存储信息,其中e[i][j]表示i点到j点的距离。若是无法到达则设置为正无穷大。若是e[i][i]则表示e[i][i]=0。
用void memset(void buffer, int c, int count)对数组进行初始化。其中buffer是数组,c是每个元素的值,buffer的长度。若c=0x3f3f3f3f,则表示正无穷大
先假设两点路程只经过0号顶点:
只需要判断e[i][j]>e[i][0]+e[0][j]是否成立,若成立则设置e[i][j]=e[i][0]+e[0][j]
其他点以此类推。
代码实现如下:
#include <iostream>
using namespace std;
int main()
{
int e[10][10], n, m, t1, t2, t3;//t1是起点,t2是终点,t3是t1到t2的距离,n是顶点的个数,m是线段的个数
memset(e, 0x3f3f3f3f, sizeof(e));//对e中的每个元素进行初始化
cin >> n >> m;
for (int i = 0; i < n; i++)//设置本身到本身的距离为0
{
for (int j = 0; j < n; j++)
{
if (i == j)//设置本身到本身的距离为0
e[i][j] = 0;
}
}
for (int i = 0; i < m; i++)//输入数据
{
cin >> t1 >> t2 >> t3;
e[t1][t2] = t3;
}
for (int i = 0; i < n; i++)//Floyd算法主要内容
{ //i代表两点路程只经过i点。
for (int j = 0; j < n; j++)
{
for (int k = 0; k < n; k++)
{
if (e[j][k] > e[j][i] + e[i][k])//更新两点路程若经过i点时的数据
e[j][k] = e[j][i] + e[i][k];
}
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<nj++)
{
cout<<e[i][j];//此时的e中每个元素都是两点之间最短的距离
}
}
return 0;