链式前向星+堆优化dijkstra
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
bool vis[1000010];
int cnt=0,head[1000010],dis[1000010],s;
struct edge
{
int next,to,w=2147483647;
}edge[1000010];
void add(int u,int v,int d)
{
edge[++cnt].to=v,edge[cnt].w=min(edge[cnt].w,d),edge[cnt].next=head[u],head[u]=cnt;
}
void dijkstra()
{
memset(dis,999999,sizeof(dis));
dis[s]=0;
priority_queue<pair<int,int> > q;
q.push(make_pair(0,s));
while(!q.empty())
{
int x=q.top().second;
q.pop();
if(vis[x])continue;
vis[x]=1;
for(int i=head[x];i!=-1;i=edge[i].next)
{
int y=edge[i].to,z=edge[i].w;
if(dis[x]+z<dis[y])
{
dis[y]=dis[x]+z;
q.push(make_pair(-dis[y],y));
}
}
}
}
int main()
{
memset(head,-1,sizeof(head));
int n,m;
cin>>n>>m>>s;
for(int i=1;i<=m;i++)
{
int u,v,d;
cin>>u>>v>>d;
add(u,v,d);
}
dijkstra();
for(int i=1;i<=n;i++)cout<<dis[i]<<" ";
return 0;
}