(os:还是模板比较友善)
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#define N 500005
#define inf 2147483647
#define ll long long
using namespace std;
int n,m,s;
struct node
{
int to,nt;
ll w;
}E[N];
int num,p[N];
void add(int x,int y,int v)
{
E[++num].to=y;E[num].w=v;
E[num].nt=p[x];p[x]=num;
}
ll dis[N];bool flag[N];queue<int> q;
void spfa(int s)
{
for(int i=1;i<=n;i++) dis[i]=inf;
q.push(s);flag[s]=1;dis[s]=0;
while(!q.empty())
{
int k=q.front();q.pop();
for(int e=p[k];e;e=E[e].nt)
{
int kk=E[e].to;
if(dis[kk]-dis[k]>E[e].w)
{
dis[kk]=dis[k]+E[e].w;
if(!flag[kk]) {flag[kk]=1;q.push(kk);}
}
}
flag[k]=0;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++)
{
int x,y,v;scanf("%d%d%d",&x,&y,&v);
add(x,y,v);
}
spfa(s);
for(int i=1;i<=n;i++) printf("%lld ",dis[i]);
return 0;
}