关于 pbds 堆的疑问。
查看原帖
关于 pbds 堆的疑问。
582501
_Sea_楼主2022/12/24 14:18
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 啊。

2022/12/24 14:18
加载中...