为什么优先队列里只有to一个元素时会紊乱啊?68,#1#4不过
查看原帖
为什么优先队列里只有to一个元素时会紊乱啊?68,#1#4不过
925658
codingmonkey123楼主2025/7/1 23:29

样例#1,#4不过。

我知道正确写法应该是在priority_queue里维护两个元素{num,dis},但是为什么只有一个num元素的情况下会出现紊乱啊?有无例子,球球。de了半天,但是想不出来什么情况下会出错。

#include<bits/stdc++.h>

#define N 100001
#define M 200001

using namespace std;

int n,m,s;

struct EDGE{
    int to=0;
    int num;
    long long w;
}edge[M];

int cnt=1;

map<int,vector<int>> head;

long long dis[N];

int vis[N]={0};

void init(){
    for(int i=1;i<=n;i++){
        dis[i]=1e18;
    }
}

void addedge(const int &u,const int &v,const long long &w){
    edge[cnt].num=u;
    edge[cnt].to=v;
    edge[cnt].w=w;
    head[u].push_back(cnt);
    cnt++;
}

struct cmp{
    bool operator ()(int a,int b){
        return dis[a]>dis[b];
    }
};

void dijkstra(int s){
    priority_queue<int,vector<int>,cmp> pq;
    pq.push(s);
    pre[s]=0;
    dis[s]=0;
    while(pq.empty()!=1){
        int node=pq.top();
        pq.pop();
        if(vis[node])continue;
        vis[node]=1;
        for(auto i:head[node]){
            int to=edge[i].to;
            if(dis[to]>dis[node]+edge[i].w){
                dis[to]=dis[node]+edge[i].w;
                pq.push(to);
            }
        }
        
    }
    
}


int main(){
    cin>>n>>m>>s;
    init();
    for(int i=1;i<=m;i++){
        int u,v;
        long long w;
        cin>>u>>v>>w;
        addedge(u,v,w);
    }
    dijkstra(s);

    for(int i=1;i<=n;i++){
        cout <<dis[i]<<' ';
    }
    
    return 0;
}
2025/7/1 23:29
加载中...