网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
03月05日
漏签
0
天
noip吧
关注:
25,169
贴子:
642,097
看贴
图片
吧主推荐
视频
游戏
14
回复贴,共
1
页
<<返回noip吧
>0< 加载中...
【求助】dijkstra+heap
只看楼主
收藏
回复
贴吧用户_0JGZMX5
提高一等
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我看了先关资料,自己写了一个简单的。
但是不懂的是每次松弛后各个点的d值不变吗?
这个时候怎么不用对heap进行维护。
还是说维护了,我没看见。
有高手给个简单易懂的解释吗?
有C语言+注释的代码更好
wyl8899
NOI金牌
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
Dijkstra+Heap有两种写法
根据算法流程得到的比较中规中矩的实现方法是 维护一个有n个元素的堆
每次松弛完了以后 调整对应的元素在堆里的位置
这需要额外维护编号为i的节点在堆中的位置(在通过swap调整堆的时候更新一下就好了
另外一种就比较简洁一点 允许同一个节点以不同的距离标号出现在堆中
具体来说 堆中的元素都是形如(x,dis)的数对 表示一个节点及其距离标号
不管一个节点在堆里出现了多少次 最先被弹出的一定是我们需要的那个dis最小的
具体的实现就自己琢磨一下吧..
如果借助STL的priority_queue可以写得很短
wyl8899
NOI金牌
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
swap指的是"将堆中两个元素的位置对换"的操作
所有对堆的维护都是用swap来表达的对吧 所以就在swap的时候进行维护信息就好了
第二种的话 要点在于 堆里存储的不是一个数 而是一个数对(x,dis)
假设我们试图用d[u]+w(u,v)去更新d[v] 那么就把(v,d[u]+w(u,v))加入堆中
然后每次从堆里取出dis最大的数对就好了
贴吧用户_0JGZMX5
提高一等
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我不会c++ 只会c 能用stl吗?
不能用的话只能自己写了
……
XGHeaven
怒进省队
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
在当每次松弛之后,往堆里加入的点已经符合堆的性质,不需维护,此时再往堆里加入刚刚松弛的点时,也是符合堆的,所以也不需要维护。
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示