rt,我在 https://www.luogu.com.cn/discuss/970132 中问到了 vector 最短路写法,以下是我修改后的代码(能正常通过):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair < int, int > pii;
const int N =1e5 + 5;
int n,m,s,dis[N],vis[N];
vector <pii> g[N];
void dij(int s) {
priority_queue<pii>q;
for(int i=0;i<=n;i++)dis[i]=2147483647;
dis[s]=0,q.push({0,s});
while(q.size()){
pii u=q.top();
q.pop(),u.first*=-1;
if(!vis[u.second]){
vis[u.second]=1;
for(auto v:g[u.second]){
if(!vis[v.first]&&dis[v.first]>dis[u.second]+v.second){
dis[v.first]=dis[u.second]+v.second;
q.push({-dis[v.first],v.first});
}
}
}
}
}
int main() {
cin>>n>>m>>s;
for(int i=1,u,v,w;i<=m;i++) {
cin>>u>>v>>w;
g[u].push_back({v,w});
}
dij(s);
for(int i=1;i<=n;i++)cout<<dis[i]<<" ";
}
但是我把栈中 pair<int,int> 两个元素互换位置之后就 WA 了,求问为什么
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair < int, int > pii;
const int N =1e5 + 5;
int n,m,s,dis[N],vis[N];
vector <pii> g[N];
void dij(int s) {
priority_queue<pii>q;
for(int i=0;i<=n;i++)dis[i]=2147483647;
dis[s]=0,q.push({s,0});
while(q.size()){
pii u=q.top();
q.pop(),u.second*=-1;
if(!vis[u.first]){
vis[u.first]=1;
for(auto v:g[u.first]){
if(!vis[v.first]&&dis[v.first]>dis[u.first]+v.second){
dis[v.first]=dis[u.first]+v.second;
q.push({v.first,-dis[v.first]});
}
}
}
}
}
int main() {
cin>>n>>m>>s;
for(int i=1,u,v,w;i<=m;i++) {
cin>>u>>v>>w;
g[u].push_back({v,w});
}
dij(s);
for(int i=1;i<=n;i++)cout<<dis[i]<<" ";
}