题目描述
略
代码
#include <cstdio>
#include <cstdlib>
#include <queue>
#define open(s) freopen(s".in","r",stdin); freopen(s".out","w",stdout);
#define close fclose(stdin); fclose(stdout);
using namespace std;
struct node
{
int pos;
long long d;
bool operator < (const node &b) const
{
return d>b.d;
}
};
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 dijkstra(int s)
{
priority_queue<node>q;
q.push((node){s,0});
for(int t=1;t;)
{
int p=q.top().pos; q.pop(); --t;
if(f[p]) continue;
f[p]=1;
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;
q.push((node){edge[i].to,d[edge[i].to]}); ++t;
}
}
}
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);
}
dijkstra(s);
for(int i=1;i<=n;++i)
printf("%lld ",d[i]);
close;
return 0;
}