ll dis[N] ;
bool vis[N] ;
__gnu_pbds::priority_queue< pair<ll,int> , greater<pair<ll,int> > > h;
__gnu_pbds::priority_queue< pair<ll,int> , greater<pair<ll,int> > >::point_iterator pos[N] , nul;
ll dij(int s,int t) {
memset(dis,0x3f,sizeof dis) ;
memset(vis,0,sizeof vis);
dis[s] = 0 ;
// rep(i,1,N - 1) pos[i] = NULL ;
h.clear( );
pos[s] = h.push( mkp ( dis[s] , s) );
while(h.size( )) {
auto[d, u] = h.top( ) ; h.pop( ) ; pos[u] = NULL;
assert(d == dis[u]) ;
if(vis[t]) break;
if(dis[u] > dis[t]) break;
if(vis[u]) continue;
vis[u] = 1 ;
for(auto[v,w]:ed[u]) {
if(d + w < dis[v]) {
dis[v] = d + w ;
if(pos[v] != NULL) h.modify( pos[v] , mkp(dis[v] , v) );
else pos[v] = h.push( mkp (dis[v] , v) );
}
}
}
return dis[t] ;
}
这是我在本题中使用的 pbds 堆优化 dij ,能够通过模板题,并且一直被我当作模板使用。
但是在这道题中由于会多次使用 dij,它发生了莫名其妙的 RE,并且将 pbds 堆换成 STL 堆就可以正常运行,并且在最后 return 前面加入这一行
while(h.size( )) pos[h.top( ).second] = NULL , h.pop( ) ;
就可以 AC 。
请问有没有大佬知道这是 pbds 的什么奇怪性质吗。
在开头清空时我的代码会将 pos 置为 NULL 啊。