Floyd算法又称为插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。
注意:其实很多题目不是直接问你floyd怎么求最短路径,而是要你利用floyd的动态规划思想解决类似floyd的问题。
Floyd算法可以算边权值非负的最短路径问题。下面给出算法模板
#include<cstdio>
using namespace std;
#define INF 1e9
const int maxn=100+10;
int n,m;//点数,边数,点从0到n-1编号
int dist[maxn][maxn];//记录距离矩阵
int path[maxn][maxn];//path[i][j]=x表示i到j的路径上(除i外)的第一个点是x.
void init()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
dist[i][j] = i==j?0:INF;//其实这里d[i][j]应该还要通过输入读数据的
path[i][j]=j;
}
//读取其他dist[i][j]的值
}
void floyd()
{
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(dist[i][k]<INF && dist[k][j]<INF )
{
if(dist[i][j]>dist[i][k]+dist[k][j])
{
dist[i][j] = dist[i][k]+dist[k][j];
path[i][j] = path[i][k];
}
else if(dist[i][j] == dist[i][k]+dist[k][j] &&path[i][j]>path[i][k])
{
path[i][j] = path[i][k]; //最终path中存的是字典序最小的路径
}
}
}
输出路径例程:
printf("Path: %d", u);
int beg = path[u][v];
while (1){
printf("-->%d", beg);
if (beg == v) { cout << endl; break; }
beg = path[beg][v];
}