题目链接:单源最短路径(标准版)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
int d[100005];
bool f[100005];
int head[100005],n,m,s,tot=0;
struct node
{
int v,w,next;
}edge[200005];
struct tnode
{
int v,dis;
};
void add(int u,int v,int w)
{
edge[++tot].v=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot;
}
bool operator < (tnode a,tnode b)
{
return a.dis>b.dis;
}
priority_queue<tnode>q;
int main()
{
int u,v,w;
memset(d,0x3f,sizeof(d));
cin>>n>>m>>s;
d[s]=0;
for(int i=1;i<=m;i++)
{
cin>>u>>v>>w;
add(u,v,w);
}
q.push({s,0});
while(!q.empty())
{
u=q.top().v;
q.pop();
if(f[u])continue;
f[u]=true;
for(int i=head[u];i;i=edge[i].next)
{
v=edge[i].v;
if(d[v]>d[u]+edge[i].w)
{
d[v]=d[u]+edge[i].w;
q.push({v,d[v]});
}
}
}
for(int i=1;i<=n;i++)
cout<<d[i]<<' ';
return 0;
}