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蓝名啊,没必要如此尊称