用的dijkstra
#include<bits/stdc++.h>
using namespace std;
//70pts
int n,m,s,y,v,x;
int dis[500001],value[500001],h[10001],nxt[500001],to[500001],cnt;
const int d=INT_MAX;
bool vis[10001];
void dijkstra(){
int minn=d,u=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[j]<minn&&!vis[j])
minn=dis[j],u=j;
}
vis[u]=1;
for(int j=h[u];j;j=nxt[j]){
if(!vis[j]&&value[u]<d&&dis[u]+value[j]<dis[to[j]]){
dis[to[j]]=dis[u]+value[j];
}
}
}
}
void add(int a,int b,int c){
to[++cnt]=b;
value[cnt]=c;
nxt[cnt]=h[a];
h[a]=cnt;
}
int main(){
memset(value,d,sizeof(value));
memset(dis,d,sizeof(dis));
cin>>n>>m>>s;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&y,&v,&x);
add(y,v,x);
}
dis[s]=0;
dijkstra();
for(int i=1;i<=n;i++){
printf("%d ",dis[i]);
}
return 0;
}