疑问,玄关

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

wangzilong913 @ 2024-07-23 15:15:51

萌新求助,玄关。

#include <bits/stdc++.h>
using namespace std;
int n,m,s;
int dis[150005];
bool vis[150005];
vector<pair<int,int > > a[150005];
priority_queue<pair<int,int >,vector<pair<int,int > >,greater<pair<int,int > > > q;
int main(){
    memset(dis,0x3f,sizeof(dis));
    cin>>n>>m>>s;
    for(int i = 1;i <= m;i++){
        int x,y,z;
        cin>>x>>y>>z;
        a[x].push_back({y,z});
    }
    dis[s] = 0;
    q.push({0,s});
    while(!q.empty()){
        int k = q.top().second;
        q.pop();
        if(vis[k] == true){
            continue;
        }
        vis[k] = true;
        for(int j = 0;j < a[k].size();j++){
            int y,z;
            y = a[k][j].first;
            z = a[k][j].second;
            if(dis[k] + z < dis[y]){
                dis[y] = dis[k] + z;
                q.push({dis[y],y});
            }
        }
    }
    for(int i = 1;i <= n;i++){
        if(dis[i] == 0x3f3f3f3f){
            cout<<INT_MAX<<" ";
        }
        else{
            cout<<dis[i]<<" ";
        }
    }
    return 0;
}

1.为什么上面的 q.top().first 根本没用过,删去了就会WA on #1 #2 #3 #4 ?

2.为什么优先队列中用到了 pair 却不需要重载 < 运算符?


by Justin_ding @ 2024-07-23 15:19:59

2我能回答,pair自动第一关键字优先排序,1我不能


by Justin_ding @ 2024-07-23 15:21:30

这下我能了,因为第一关键字优先排序,所以需要(瞎猜的,也不知道对不对)


by 枫原万叶 @ 2024-07-23 15:21:45

@wangzilong913

对于第一个问题,q.top().first虽然在代码中没有直接被使用,但它是priority_queue排序的依据。priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int > > > q这个定义表示按照pair的第一个元素从小到大排序。如果删除了q.top().first,就无法按照正确的顺序取出元素,导致算法错误,从而出现错误的结果。 对于第二个问题,在这个代码中使用了greater<pair<int,int > >作为比较器,这就指定了按照pair的第一个元素从小到大排序,所以不需要重载<运算符。


by a18981826590 @ 2024-07-23 15:24:54

@Justin_ding @luogu_cyx 对不起,我是楼主同学,正在他旁边,现在他谷爆了,不能关注,这问题其实是我想问的,但当时没有A掉这题,不好发帖。 已关注,谢谢!


by wangzilong913 @ 2024-07-23 15:27:58

@Justin_ding @luogu_cyx %%%%% 谢谢,已关( 尽管不是我问的but 好心的大佬必须关注


by Justin_ding @ 2024-07-23 15:29:55

@wangzilong913 谁家dalao蓝名啊,没必要如此尊称


|