关于lhx大佬对dijkstra的一个优化
__vector__ · · 个人记录
问题描述:
可以看一下这份60分代码,它TLE了,而且使用了堆优化,常数大小也能接受。
解决方案描述
可以发现,在一个图中,初始时全都是无穷大,不是最优解,所以肯定先有一轮更新。在之后的更新中,如果发现当前目标点已经是最优值,那么不用将目标点加入队列继续更新,因为如果是最优值那么肯定更新过,并且之前更新时肯定从目标点出发过。
根据图来
根据dij的步骤:
1、更新
2、更新
3、更新
后面的步骤省略
代码实现:
将:
if(dis[to]>dis[u]+edge[i].w){
dis[to] = dis[u] + edge[i].w;
}
que.push(make_pair(-dis[to], to));
改为:
if(dis[to]>dis[u]+edge[i].w){
dis[to] = dis[u] + edge[i].w;
que.push(make_pair(-dis[to], to));
}
优化正确性解释:
见第三步解释
效果:
修改后的代码AC了