#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2000004;
int head[MAXN];
int ans[MAXN];
bool vis[MAXN];
int n,m,s,cnt;
struct node
{
int to,nxt,wei;
}node[MAXN];
int read()
{
int a=0,x=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') x=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
a=(a<<1)+(a<<3)+ch-48;
ch=getchar();
}
return a*x;
}
void write(int a)
{
if(a<0) putchar('-'),a=-a;
if(a>9) write(a/10);
putchar(a%10+48);
}
void addedge(int nodea,int nodeb,int howlong)
{
node[++cnt].to = nodeb;
node[cnt].wei = howlong;
node[cnt].nxt = head[nodea];
head[nodea] = cnt;
}
int main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
cin >> n >> m >> s;
for(int i=1;i<=m;i++) ans[i] = 1e10;
ans[s] = 0;
for(int i=1;i<=m;i++)
{
int cinsafxd,cinsbfxd,cinscfxd;
cinsafxd = read();
cinsbfxd = read();
cinscfxd = read();
addedge(cinsafxd,cinsbfxd,cinscfxd);
}
int pos=s;
while(vis[pos] == 0)
{
long long mn = 1e10;
vis[pos] = 1;
for(int i=head[pos];i!=0;i=node[i].nxt)
if(!vis[node[i].to]&&ans[node[i].to] > ans[pos]+node[i].wei)
ans[node[i].to] = ans[pos]+node[i].wei;
for(int i=1;i<=m;i++)
if(ans[i]<mn && vis[i]==0)
{
mn = ans[i];
pos = i;
}
}
for(int i=1;i<=n;i++)
{
write(ans[i]);
printf(" ");
}
return 0;
}
好像死循环了,但样例又过了,造了几组数据也过了,那位神犇可以帮帮忙