#119. 非负权单源最短路

题面

代码

似乎数据想让\(dijstra\)(不优化也行)和\(SPFA\)都能过。

我写了个堆优化的\(dijstra\),注意这句话if(dis[k.second]<-k.first)continue(懒惰删除)非常重要:堆中可能会按顺序先后放入若干个距离从大到小的相同编号的点,因为这个点的可能被不断更新。然而用过的点是没有再用的意义的,所以我们就需要加个特判(当前点进来过多个,且当前值不是最小,说明已经用这个点来松弛过其他点)或多加个数组。顺序很重要,必须先删除。

当然这样写的时间复杂度是\(mlogm\)的,因为每条边都可能会产生一个不必要的点。要提高时间复杂度的话需要换用能删除的数据结构。

\(O(mlogm)\)

你可能感兴趣的:(#119. 非负权单源最短路)