用Floyed算法和Dijkstra算法求图中顶点间最短路径

1.问题
①用Floyd算法求解下图各个顶点的最短距离,用最短距离矩阵表示
在这里插入图片描述

②用Dijkstra算法求由顶点a到顶点h的最短路径
在这里插入图片描述

2.解析
Floyed算法:
将图转化为邻接矩阵(主对角线,也就是自身到自身,我们规定距离为0,不可达为无穷大,定为10000);
依次选择编号为1,2,3,4的点为中间点m,(以1为例);判断 (map[ i ][ 1 ]+map[ 1 ][ j ] ) < map[ i ][ j ] 如果表达式为真,更新map[ i ] [ j ]的值为map[ i ] [ 1 ] + map[ 1 ] [ j ]。
不断更新,最终结果矩阵就是任意两点间最短距离矩阵。
在这里插入图片描述

Dijkstra算法:
Dijkstra是一种求单源最短路的算法,也是解决不带负权的图。首先也将图转化为邻接矩阵map,定义一个存储距离的数组distance和一个存储是否访问过状态的visited数组。如果a到b的距离是最短的,那么a通过b到和b相连的点的距离也是最短的;Dijkstra 的思路就是这样,每次给a找到一个距离最近的b,然后将b加入到集合a中,并记录下源点到b的距离(这就是源点到b的最短路),继续寻找下一个b;直到所有顶点都包含,每次判断distance并更新,最后所有顶点都包括的distance的值就是最短距离。
在这里插入图片描述

3.设计
Floyed算法:
for (把每个点作为中介点)
{
for (遍历矩阵每个点)
{
for (遍历矩阵每个点)
{
if (把矩阵该点与中介点连接后的点距离作比较)
{
G.map[i][j] = G.map[i][m] + G.map[m][j];//为真则更新
}
}
}
}
Dijkstra算法:
for (int i = 1; i <= G.vexs - 1; i++)
{
int minn = 10000;
int temp = v;
for (遍历寻找最短距离的点)
{
if (如果该点距离短且没有被访问过则更新最短距离)
{
minn = distance[j];
temp = j;
}
}
visited[temp] = 1;
for (int i = 1; i <= G.vexs; i++)
{
if (把该点总距离与找到的最短距离连接后的总距离作比较)
distance[i] = distance[temp] + G.map[temp][i];//为真则更新
}
}
4.分析
算法中的三个for循环,时间复杂度为O(N^3);
Dijkstra算法的时间复杂度为O(N^2);
5.源码
https://github.com/Marvisss/-Floyed-Dijkstra-/tree/main

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值