代码(Dijkstra算法):
#include<bits/stdc++.h>
using namespace std;
const int N=10005;
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<int,int> > 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,0x3f,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++){
if(d[i]<1e9)cout<<d[i]<<" ";
else cout<<INT_MAX<<" ";
}
return 0;
}