Floyd可以求出任意两点间的最短距离,代码也相对简单,对于稀疏图来说效率也还是不错的,但由于三个for循环导致时间复杂度较高,不适合稠密图。
Floyd算法模板(精简版):
void Floyd()
{
int dist[maxn][maxn]; // dist存储i到j的最短距离
for(int k = 1; k <= n; k++)
for(int i = 1;i <= n; i++)
for(int j = 1; j <= n; j++)
if(dist[i][k] + dist[k][j] < dist[i][j])
dist[i][j] = dist[i][k] + dist[k][j]; // 不断更新最短距离
}
记录最短路径模板:
void floyd()
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
{
dist[i][j] = map[i][j],
path[i][j] = 0;
}
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(dist[i][k] + dist[k][j] < dist[i][j])
{
dist[i][j] = dist[i][k] + dist[k][j];
path[i][j] = k; // path记录路径中的最大点
}
}
void output(int i,int j) // 用递归的方式输出路径,i是起点,j是终点
{
if(i == j) return;
if(path[i][j] == 0) cout<<j<<' ';
else
{
output(i,path[i][j]);
output(path[i][j],j);
}
}