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 自带比较器还是不知道行不行。