首先看看实现代码
简单写写
弗洛伊德算法
int dist[N]; // dist[i]表示起始点到i的距离
int w[iN][N]; // w[i][j]表示i到j的边的权值,如果不相邻,则为无穷大
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n;j++)
{
dist[j] = min(dist[j], dist[i] + w[i][j]);
}
}
迪杰斯特拉算法
int dist[N]; // dist[i]表示start到i的距离
int w[iN][N]; // w[i][j]表示i到j的边的权值,如果不相邻,则为无穷大
bool in[N]; // in[i]表示i是否在最短路径内
for(int i = 0;i < n;i++)
{
int idx;
int min_ = inf;
for(int j = 0;j < n;j++)
{
if(dist[j] < min_)
{
min_ = dist[j];
idx = j;
}
}
in[idx] = true;
for(int j = 0;j < n;j++)
{
if(!in[j])
dist[j] = min(dist[j], dist[idx] + w[idx][j]);
}
}
总结
两者的复杂度差不多,但是可以看出弗洛伊德算法的思想就是通过遍历周围的点,用这些点作为中继去更新起始点到其它点的距离。
而迪杰斯特拉算法的思想是找到距离已更新的点们最近的那个点,用那个点去更新其它点。
两者都是找中继点,不同的是弗洛伊德算法是遍历,而迪杰斯特拉算法是先找到最近点。所以在代码上弗洛伊德算法会简洁一些。
本文深入探讨了弗洛伊德算法与迪杰斯特拉算法的实现原理与代码细节,分析了两种算法在寻找最短路径问题上的异同。弗洛伊德算法通过遍历周围点更新距离,而迪杰斯特拉算法则优先选择最近点进行更新,两者虽都用于求解最短路径,但思想和效率各有侧重。
6104

被折叠的 条评论
为什么被折叠?



