#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
queue<long long>q;
long long v[1000010],minn[1000100];
long long n,m,s,lin[1000010],tot=0;
struct min_road{
long long from,to,next,len;
}e[1000010];
void add(long long f,long long t,long long l)
{
e[++tot].from=f;
e[tot].to=t;
e[tot].len=l;
e[tot].next=lin[f];
lin[f]=tot;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&s);
for(int i=1;i<=n;i++)minn[i]=2147483647;
for(int i=1;i<=m;i++)
{
long long f,t,l;
scanf("%lld%lld%lld",&f,&t,&l);
add(f,t,l);
}
q.push(s);
v[s]=1;
minn[s]=0;
while(!q.empty())
{
long long cur=q.front();
q.pop();
v[cur]=0;
for(long long i=lin[cur];i;i=e[i].next)
{
if(minn[e[i].to]>minn[cur]+e[i].len)
{
minn[e[i].to]=minn[cur]+e[i].len;
if(!v[e[i].to])
{
q.push(e[i].to);
v[e[i].to]=1;
}
}
}
}
for(int i=1;i<=n;i++)
printf("%lld ",minn[i]);
}
这就是SPFA的邻接表存法,用于变多的情况