https://www.luogu.com.cn/problem/P4779
#include<bits/stdc++.h>
#define ll long long
#define inf 1000000000000000009
using namespace std;
const int N=200009;
struct node{
int to;
ll len;
node(int x,ll y):to(x),len(y){}
bool operator <(const node &a)const {
return len>a.len;//注意优先队列是维护最大值,所以反过来写
}
};
vector<node>w[N];
int n,m,st,v[N];
ll d[N];
void Dijkstra(){
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++)
d[i]=inf;
d[st]=0;
priority_queue<node>q;
q.push(node(st,0));
while(!q.empty()){
int x=q.top().to;
q.pop();
if(v[x])
continue;
v[x]=1;
for(int i=0;i<w[x].size();i++){
int y=w[x][i].to,len=w[x][i].len;
if(d[y]>d[x]+len){
d[y]=d[x]+len;
q.push(node(y,d[y]));
}
}
}
for(int i=1;i<=n;i++)
printf("%lld ",d[i]);
}
int main(){
scanf("%d%d%d",&n,&m,&st);
for(int i=0;i<m;i++){
int x,y;
ll z;
scanf("%d%d%lld",&x,&y,&z);
w[x].push_back(node(y,z));
}
Dijkstra();
return 0;
}