dij 全RE和WA 求调

P4779 【模板】单源最短路径(标准版)

Ggt__ @ 2024-07-21 18:40:16

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,m,s;
    cin>>n>>m>>s;
    vector<pair<int,int> > rel[n];
    for(int i=0;i<m;i++){
        int x,y,z;
        cin>>x>>y>>z;
        rel[x-1].push_back({y,z});
    }
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > dist;
    dist.push({0,s});
    for(int i=1;i<=n;i++){
        if(i!=s) dist.push({1000000001,i});
    }
    int vis[n];
    memset(vis,0,n);
    for(int i=0;i<n-1;i++){
        vis[dist.top().second-1]=1;
        for(int j=0;j<rel[dist.top().second-1].size();j++){
            if(vis[j]==0) vis[j]=dist.top().first+rel[i][j].second;
            else vis[j]=min(vis[j],dist.top().first+rel[i][j].second);
            dist.push({dist.top().first+rel[i][j].second,j+1});
        }
        dist.pop();
    }
    for(int i=0;i<n;i++) cout<<vis[i]<<" ";
}

by __youzimo2014__ @ 2024-07-24 17:04:15

@Ggt__ 注意你的优先队列最后一项 greater<pair<int,int>>

而且pair自带的比较器会不会出问题我不知道


by __youzimo2014__ @ 2024-07-24 17:05:07

greater 是大顶堆,而 dij 应该用小顶堆。


by __youzimo2014__ @ 2024-07-24 17:10:15

@Ggt__ 把循环里面 dist.top() 先取出来放到一个变量里,然后再 pop,不然会出问题。

普通队列可以这样弄,但是优先队列不一样。

循环里面是要加东西的,循环结束后再 pop 的时候,队列顶部的东西可能和原来想要 pop 的东西不一样了。


by Ggt__ @ 2024-07-24 18:11:03

@youzimo2014 阿里嘎多


by __youzimo2014__ @ 2024-07-24 18:34:21

@Ggt__ greater 没啥问题,但是 pair 自带比较器还是不知道行不行。


|