#includeusing namespace std; const int N=100005; const int M=500005; int head[M],edge[M],ver[M],nxt[M],tot=0; bool v[N]; int d[N]; long long n,m,s; priority_queue< pair > q; void add(int x,int y,int z){ ver[++tot]=y,nxt[tot]=head[x],edge[tot]=z,head[x]=tot; } void dijkstra(){ memset(d,9999999,sizeof(d)); memset(v,0,sizeof(v)); d[s]=0; q.push(make_pair(0,s)); while(!q.empty()){ int x=q.top().second; q.pop(); if(v[x]==1) continue; v[x]=1; for(int i=head[x];i;i=nxt[i]){ int y=ver[i],z=edge[i]; if(d[y]>d[x]+z){ d[y]=d[x]+z; q.push(make_pair(-d[y],y)); } } } } int main(){ scanf("%d%d%d",&n,&m,&s); for(int i=1;i<=m;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); } dijkstra(); for(int i=1;i<=n;i++){ cout<


![[模板]单源最短路径 [模板]单源最短路径](http://www.mshxw.com/aiimages/31/311541.png)
