算法分析与设计第二次作业

本文详细介绍了Floyd和Dijkstra两种经典的图算法。Floyd算法用于解决任意两点间的最短路径问题,通过枚举中介节点的方式进行迭代优化;而Dijkstra算法则解决了单源最短路径问题,通过不断寻找并更新当前可达范围内最短路径来逐步求解。

1.问题
用Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵),按实验报告模板编写算法。
在这里插入图片描述

对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径,按实验报告模板编写算法。
在这里插入图片描述

2.解析
Floyd算法:
求点i到点j的最短路径。直接从i到j或者从i出发经过其他若干个k到达j。对于每个顶点i,j判断是否存在k使得i到j的距离更短。

Dijkstra算法:
首先把起点到所有点的距离存下来找个最短的,然后遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离再找出最短的,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。
3.设计

Floyd算法: 
枚举顶点k ∈ [1,n]
	以顶点k为中介点,枚举所有顶点对i和j(i ∈ [1,n],j ∈1[1,n])
		如果dis[i][k] + dis[k][j] <dis[i][j]成立
			赋值dis[i][j] = dis[i][k] + dis[k][j]
 Dijkstra算法:
Dijkstra(G,d[],s){
	初始化
	for(循环n次){
	u = 使dis[u]最小的还未访问的顶点的标号;
	记u已被访问;
	for(从u出发能到达的所有顶点v){
		if(v未被访问&&以u为中介点使s到顶点v的最短距离dis [v]更优){
		 优化d[v]; 
			} 
		} 
	}
}

4.分析
Floyd:O(n^3)
Dijkstra:O(e·logu)(e边数,u顶点数)

5.源码
https://github.com/lmouette/-/blob/main/floyd.cpp
https://github.com/lmouette/-/blob/main/dijkstra.cpp

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值