题目描述
略
代码
#include <cstdio>
#include <cstdlib>
#include <deque>
#define open(s) freopen(s".in","r",stdin); freopen(s".out","w",stdout);
#define close fclose(stdin); fclose(stdout);
using namespace std;
struct Edge
{
int to;
int next;
int w;
};
int n,m;
int cnt;
long long d[10005];
int head[10005];
bool f[10005];
Edge edge[500005];
void add(int x,int y,int z)
{
++cnt;
edge[cnt].next=head[x];
edge[cnt].w=z;
edge[cnt].to=y;
head[x]=cnt;
}
void spfa(int s) //SLF :设要加入的节点是j,队首元素为i,若dist(j)<dist(i),则将j插入队首,否则插入队尾
{
deque<int>q;
q.push_back(s);
for(int t=1;t;)
{
int p=q.front(); q.pop_front(); --t;
f[p]=0;
for(int i=head[p];i;i=edge[i].next)
if(d[edge[i].to]>d[p]+edge[i].w)
{
d[edge[i].to]=d[p]+edge[i].w;
if(!f[edge[i].to])
{
if(d[edge[i].to]<d[q.front()])
q.push_front(edge[i].to);
else
q.push_back(edge[i].to);
++t;
f[edge[i].to]=1;
}
}
}
}
int main()
{
open("3371");
int s;
scanf("%d %d %d",&n,&m,&s);
for(int i=1;i<=n;++i)
d[i]=2147483647;
d[s]=0;
for(int i=1;i<=m;++i)
{
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
add(x,y,z);
}
spfa(s);
for(int i=1;i<=n;++i)
printf("%lld ",d[i]);
close;
return 0;
}