算法学习--迪杰斯特拉和弗洛伊德

本文介绍了迪杰斯特拉算法和弗洛伊德算法,用于求解图中的最短路径问题。迪杰斯特拉算法适用于求解起点到其他节点的最短路径,而弗洛伊德算法则可找到所有节点间的最短路径。通过邻接矩阵和邻接链表来表示图,并提供了JAVA代码实现。
摘要由CSDN通过智能技术生成

一、迪杰斯特拉

求解图中由起点开始到其他节点的最短路径问题(权值不能为负)。
主要思想:在有权值的图中,直接和起点相连的节点他们的最短路径为和起点相连的边的权值,和起点没有直接相连的节点默认为该点和起点的距离为无穷大。分别保存在两个集合S,U中。S中保存的是已经计算出的距离起点最短路径的节点,U中保存还没有计算的节点。当集合U为空时,算法结束。
在这里插入图片描述

如上图,求解A点到其他节点的最短路径。
迪杰斯特拉算法求解过程:
1.将A节点放入到集合S中,其他节点放入集合U中,集合U中保存的节点的权值都是当前节点到起点的最短路径,例如上图中的节点E,当E放入集合U中时,E的权值应该为4,而不是3。因为节点A到E的最短路径为A-C-E。
S={A},U={B,C,D,E,F,G}; 集合U中各节点到起点的权值为UV={6,1,∞,∞,∞,∞},刚开始时,只有和起点直接相连的节点有权值,其他节点权值都默认为无穷大。
2.从集合
U
中找出权值最小的节点,加入到集合S中并且更新集合U,则S={A,C},U={B,D,E,F,G},此时也应该更新集合U中各节点到起点的权值,将与节点C相连的节点的权值由无穷大更新为经过C点到A点的路径上的权值的和,如果和值比之前的权值小,则更新,否则权值不变。因为和节点C相连的节点只有节点E(已经遍历过的节点不能重复计算),所以此时只需要更新集合U中节点E的权值即可,因为节点E当前的集合中权值为无穷大,所以更新节点E的权值为经过节点C到节点A的路径的权值的和,即为4,UV={6,∞,4,∞,∞}.
3.重复第2步操作,此时S={A,C,E},U={B,D,F,G},集合U中各节点的权值为UV={6,5,6,∞}.
4.重复第2步操作,此时S={A,C,E,D},U={B,F,G},因为节点D和节点B,E,F相连,所以需要更新节点B,E,F的权值,节点D到节点A的权值为5,节点D到节点B的权值为3,节点B经过节点D到节点A的权值为8,大于节点B已存在的到节点A的权值,所以节点B不更新,以此类推,集合U中各节点的权值为UV={6,6,∞}.
5.重复第2步操作,此时S={A,C,E,D,B},U={F,G},集合U中各节点的权值为UV={6,10}.
6.重复第2步操作,此时S={A,C,E,D,B,F},U={G},集合U中各节点的权值为UV={10}.
7.重复第2步操作,此时S={A,C,E,D,B,F,G},U={},集合U中各节点的权值为.

JAVA代码实现:
将上图保存在一个二维数组中(邻接矩阵):

// -1代表无穷大
static int[][] source;
public static void main(String[] args) throws Exception {
   
		source = new int[][] {
    
	{
    0, 0, 0, 0, 0, 0, 0, 0 },
	{
    0, 0, 6, 1, -1, -1, -1, -1 },
	{
    0, 6, 0, -1, 3, -1, -1, 4 },
	{
    0, 1, -1, 0, -1, 3, -1, -1 },
	{
    0, -1, 3, -1, 0, 1, 4, -1 },
	{
    0, -1, -1, 3, 1, 0, 2, -1 },
	{
    0, -1, -1, -1, 4, 2, 0,</
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
迪杰斯特拉算法弗洛伊德算法都是用于求解最短路径的算法,但有一些区别。迪杰斯特拉算法是从一个指定的起点到其他节点之间的最短路径,而弗洛伊德算法则是求解图中所有节点之间的最短路径。\[3\]迪杰斯特拉算法采用贪心算法的策略,每次遍历到起点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。\[2\]而弗洛伊德算法的主要思想是通过引入中间节点K,逐步更新不直接相连的节点之间的距离,直到所有节点被更新,算法结束。\[3\]两种算法都可以用于解决最短路径问题,但适用的场景略有不同。 #### 引用[.reference_title] - *1* *2* [迪杰斯特拉弗洛伊德算法](https://blog.csdn.net/qq_51340322/article/details/119333825)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [算法学习--迪杰斯特拉弗洛伊德](https://blog.csdn.net/wk_jl/article/details/115109169)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值