Floyd算法相当于Dijkstra算法的扩展版,由原来的一维数组到现在的二维数组,所以Floyd算法可以求得任何一个点到其他所有点的最短路径;
for循环中k,i,j的顺序是不能改变的:k是中间点,每一个中间点都有可能能够更新任意两点之间的距离,所以,最外层for循环每轮到一个k值都得把整个二维数组跑一遍,能用k更新的就更新!
#include<cstdio>
#include<iostream>
using namespace std;
#define INF 9999999
int dis[110][110]
void floyd(int n)//n个节点
{
int i,j,k;
for (k = 1; k <= n; ++k)
{
for (i = 1; i <= n; ++i)
{
if (dis[i][k] == INF)//这条判断减少循环次数
continue;
for (j = 1; j <= n; ++j)
{
if (dis[i][j] > dis[i][k] + dis[k][j])//更新dis数组,存图用的数组也是dis数组
dis[i][j] = dis[i][k] + dis[k][j];
}
}
}
}
//初始时,要把dis数组中的每个数赋值成INF,好习惯!