浅谈Dijkstra与堆优化

首先感谢学长们的算法课!在七次课程中我总算是迈开了算法学习的第一步。然而因个人能力实在有限,有些知识没能很好地掌握。这次我将选取自己比较熟悉的Dijkstra算法进行整理。(因个人原因我对c++以及数据结构的大部分内容都比较陌生,所以博客中的错误还请各位多指正)

浅谈Dijkstra

1.解决问题

Dijkstra算法解决的是有权图的最短路径问题(指定两点间的最短路径,或指定点到其他所有点的最短路径)。需要注意的是,Dijkstra算法不适用于图存在负边的情况。

2.基本思想

贪心+动态规划

dis[i]:初始点到图上点i的距离(初始值:与初始点相邻的点dis值为边的权值,若不相邻,则为∞)。
visit[i]:图上点i是否已被最短路径经过(个人的理解是,当该节点已作为一个中间节点,在初始点到其他节点的路径上被经过时,使该节点的visit布尔值为true。仅在visit值为false中的节点寻找最小的dis值,是因为经过的节点无需经过第二次。)

1) 初始化:初始点s有dis[s]=0, 与初始点相邻的点dis值为边的权值,若不相邻,则为∞。所有点visit值都为false。
2) 在所有visit值为false的节点中找到一个dis值最小的,节点记作x。若所有visit值都为true,则算法结束。
3) 标记visit[x]=true,用x到相邻点距离更新与x相邻点的dis值:
dis[y] = min {dis[y] , dis[y] + w(x ,y ) }
其中y为x的相邻点,w
( x , y ) 为x ->y这条有有向边的权值(如果x,y不直接相邻,则令w(x,y)=∞)。

图示:
在这里插入图片描述

3.代码

以上图为例

输入:
5 6
2 3
1 3 8
2 3 16
2 5 2
3 4 11
4 5 5

#include<s
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值