样例#1,#4不过。
我知道正确写法应该是在priority_queue里维护两个元素{num,dis},但是为什么只有一个num元素的情况下会出现紊乱啊?有无例子,球球。de了半天,但是想不出来什么情况下会出错。
#include<bits/stdc++.h>
#define N 100001
#define M 200001
using namespace std;
int n,m,s;
struct EDGE{
int to=0;
int num;
long long w;
}edge[M];
int cnt=1;
map<int,vector<int>> head;
long long dis[N];
int vis[N]={0};
void init(){
for(int i=1;i<=n;i++){
dis[i]=1e18;
}
}
void addedge(const int &u,const int &v,const long long &w){
edge[cnt].num=u;
edge[cnt].to=v;
edge[cnt].w=w;
head[u].push_back(cnt);
cnt++;
}
struct cmp{
bool operator ()(int a,int b){
return dis[a]>dis[b];
}
};
void dijkstra(int s){
priority_queue<int,vector<int>,cmp> pq;
pq.push(s);
pre[s]=0;
dis[s]=0;
while(pq.empty()!=1){
int node=pq.top();
pq.pop();
if(vis[node])continue;
vis[node]=1;
for(auto i:head[node]){
int to=edge[i].to;
if(dis[to]>dis[node]+edge[i].w){
dis[to]=dis[node]+edge[i].w;
pq.push(to);
}
}
}
}
int main(){
cin>>n>>m>>s;
init();
for(int i=1;i<=m;i++){
int u,v;
long long w;
cin>>u>>v>>w;
addedge(u,v,w);
}
dijkstra(s);
for(int i=1;i<=n;i++){
cout <<dis[i]<<' ';
}
return 0;
}