RT(悬关),在写本题的时候发现了下面的问题:使用STL的优先队列会wa on 9,但是使用普通的队列就能够AC,背后的原因可能是什么?下面是代码(已省略建边过程):
typedef pair<int,int> PII;
struct node{
int to;
int val;
};
queue<int> heap;
heap.push(1);
dist[1]=0;
cnt[1]=1;
inqueue[1]=1;
while(heap.size()){
auto u=heap.front();
//cerr<<u<<endl;
heap.pop();
inqueue[u]=0;
for(auto [v,val]:edge[u]){
//cerr<<"v= "<<v<<" u="<<u<<" dist[v]="<<dist[v]<<endl;
if(dist[v]>dist[u]+val){
//cerr<<"v= "<<v<<" u="<<u<<" dist[v]="<<dist[v];
dist[v]=dist[u]+val;
if(inqueue[v]==0){
cnt[v]++;
inqueue[v]=1;
heap.push(v);
if(cnt[v]>=n){
cout<<"YES"<<endl;
return;
}
}
}
}
}
cout<<"NO"<<endl;
优先队列版本:
typedef pair<int,int> PII;
struct node{
int to;
int val;
};
priority_queue<PII,vector<PII>,greater<PII>> heap;
heap.push({0,1});
dist[1]=0;
cnt[1]=1;
inqueue[1]=1;
while(heap.size()){
auto [_,u]=heap.top();
//cerr<<u<<endl;
heap.pop();
inqueue[u]=0;
for(auto [v,val]:edge[u]){
//cerr<<"v= "<<v<<" u="<<u<<" dist[v]="<<dist[v]<<endl;
if(dist[v]>dist[u]+val){
//cerr<<"v= "<<v<<" u="<<u<<" dist[v]="<<dist[v];
dist[v]=dist[u]+val;
if(inqueue[v]==0){
cnt[v]++;
inqueue[v]=1;
heap.push({dist[v],v});
if(cnt[v]>=n){
cout<<"YES"<<endl;
return;
}
}
}
}
}
cout<<"NO"<<endl;