1.问题
1、用Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵),按实验报告模板编写算法。
2、对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径,按实验报告模板编写算法。
2.解析
(1)Floyd
若则dist[i][k] + dist[k][j] < dist[i][j]更新dist[i][j] 。
当三层遍历完毕之后,所有点对之间的最短路径长度就能求出来了。当然,如果只需要求某个点到其他所有点的最短距离,那么固定u,也就是说只用两层遍历就可以做到了。
最后的矩阵为
(2) Dijkstra
①在开始时,将所有节点的(到起点)距离设为无穷大;全部(包括起点)纳入不确定集合中。
②选择起点,将其(到起点)距离设为0。因为自己到自己的距离肯定为0。
③循环地从不确定集合中选择一个节点,加入确定集合。
当不确定集合为空时,此循环结束。
3.设计
1、Floyd算法
void floyd(){
for(int a=1;a<=n;a++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
d[i][j]=min(d[i][j],d[i][a]+d[a][j]);
}
2、Dijkstra算法
void Dijkstra() {
for (i = 1; i <= n - 1; i++)
{
min = inf;
for (j = 1; j <= n; j++)
{
if (book[j] == 0 && dis[j] < min)
{
min = dis[j];
u = j;
}
}
book[u] = 1;
for (v = 1; v <= n; v++)
{
if (e[u][v] < inf)
{
if (dis[v] > dis[u] + e[u][v])
dis[v] = dis[u] + e[u][v];
}
}
}
}
4.分析
算法复杂度:
Floyd:O(n^3)
Dijkstra:O(n^2)
5.源码
[github源码地址]
https://github.com/land555/algorithm-analy-sis/blob/main/week2-Dijkstra.cpp
https://github.com/land555/algorithm-analy-sis/blob/main/week2-Floyd.cpp