用priority_queue实现的堆优化查找dis的最小值 STL吼啊= =
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#define LL long long
#define inf 2147483647
using namespace std;
const int N=2200000;
int n,m,s,u[N],v[N],from[N],to[N];
int flag[N],cnt=0,x,y,z;
LL w[N],dis[N];
int rd(){
int c=getchar(),num=0,neg=1;
while (c<'0' || '9'<c){
if (c=='-') neg=-1;
c=getchar();
}
while ('0'<=c && c<='9'){
num=num*10+c-'0';
c=getchar();
}
return neg*num;
}
priority_queue< pair<int,int> > q;
int main(){
n=rd(); m=rd(); s=rd();
for (int i=1; i<=m; i++){
u[++cnt]=rd(); v[cnt]=rd(); w[cnt]=rd();
to[cnt]=from[u[cnt]];
from[u[cnt]]=cnt;
}
for (int i=1; i<=n; i++) dis[i]=inf;
dis[s]=0; q.push(make_pair(0,s));
while (!q.empty()){
int x=q.top().second; q.pop();
if (flag[x]) continue;
flag[x]=1;
for (int i=from[x]; i>0; i=to[i]){
if (dis[v[i]]>dis[x]+w[i]){
dis[v[i]]=dis[x]+w[i];
q.push(make_pair(-dis[v[i]],v[i]));
}
}
}
for (int i=1; i<=n; i++) printf("%lld ",dis[i]);
return 0;
}