提交记录
#include<cstdio>
#include<queue>
using namespace std;
typedef long long ll;
const int MAXN=10010,MAXM=500010;
const ll INF=(1<<31)-1;
ll n,m,s,head[MAXN],dis[MAXN],cnt;
bool vis[MAXN];
struct EDGE
{
ll v,w,nxt;
}edge[MAXM];
struct node
{
ll u,dis;
bool operator<(node a)const
{
return dis>a.dis;
}
};
priority_queue<node> q;
void add(ll u,ll v,ll w)
{
cnt++;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].nxt=head[u];
head[u]=cnt;
}
void dijkstra(ll sn)
{
dis[sn]=0;
vis[sn]=true;
for(ll i=head[sn];i;i=edge[i].nxt)
{
ll v=edge[i].v,w=edge[i].w;
dis[v]=w;
q.push((node){v,dis[v]});
}
while(!q.empty())
{
ll u=q.top().u;
q.pop();
if(vis[u]) continue;
vis[u]=true;
for(ll i=head[u];i;i=edge[i].nxt)
{
ll v=edge[i].v,w=edge[i].w;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
q.push((node){v,dis[v]});
}
}
}
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&s);
for(ll i=1;i<=n;i++)
{
dis[i]=INF;
}
ll u,v,w;
for(ll i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&u,&v,&w);
add(u,v,w);
}
dijkstra(s);
for(ll i=1;i<=n;i++)
{
printf("%lld ",dis[i]);
}
return 0;
}