实验报告
课程名称 《算法分析与设计》 实验日期 2021年 3月15日 至 2021年3月20日
学生姓名 王浩楠 所在班级 计算机195 学号 2019212212179
实验名称
实验地点 同组人员
1.问题
[描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)]
用Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵),按实验报告模板编写算法。
对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径,按实验报告模板编写算法。
2.解析
[问题的理解和推导,可用电子版直接在此编写,也可用纸笔推导,拍照嵌入本文档]
第一题:
![(https://img-blog.csdnimg.cn/20210530102520300.png)
程序按以上思想设计
第二题:
第一步:选择顶点a。
S={a(0)}
U={b(1),c(∞),d(∞),e(∞),f(∞),g(∞),h(∞)}
第二步:选择顶点b。
S={a(0),b(1)}
U={c(∞),d(3),e(∞),f(∞),g(∞),h(∞)}
第三步:选择顶点d。
S={a(0),b(1),d(3)}
U={c(4),e(∞),f(11),g(∞),h(∞)}
第四步:选择顶点c。
S={a(0),b(1),d(3),c(4)}
U={e(∞),f(11),g(∞),h(∞)}
第五步:选择顶点f。
S={a(0),b(1),d(3),c(4),f(11)}
U={e(13),g(∞),h(∞)}
第六步:选择顶点e。
S={a(0),b(1),d(3),c(4),f(11),e(13)}
U={g(15),h(∞)}
第七步:选择顶点g。
S={a(0),b(1),d(3),c(4),f(11),e(13),g(15)}
U={h(18)}
第八步:选择顶点h。
S={a(0),b(1),d(3),c(4),f(11),e(13),g(15),h(18)}
3.设计
[核心伪代码]
//Floyd-Warshall算法核心语句
for (k = 1; k <= n; k++)
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if (e[i][j] > e[i][k] + e[k][j])
e[i][j] = e[i][k] + e[k][j];
//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³)
空间复杂度:O(n^2)
Dijkstra算法
时间复杂度:O(n²)
5.源码
[github源码地址]
https://github.com/Wanghaonan520/algorithm