问题求助
查看原帖
问题求助
769134
False0099楼主2024/8/1 11:10

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;
2024/8/1 11:10
加载中...