题目描述
单源最短路径模板。
使用 SPFA 肯定是不行的啦,网格图hack。
所以我们使用 Dijkstra 算法。
这里有一篇写的很好的 blog,无必要赘述。最后贴上代码。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<algorithm>
#define reg register
struct node{
int x,y,d,next;
}e[500010];
int len=0;
int first[500010];
int ST;
int f[500010];
int s1,s2,s3;
int n,m;
bool v[500010];
struct nod{
int x,d;
friend bool operator<(const nod&a,const nod&b){
return a.d>b.d;
}
};
std::priority_queue<nod> q;
void ins(int x,int y,int d){
e[++len].x=x;e[len].y=y;e[len].d=d;
e[len].next=first[x];first[x]=len;
}
void dijkstra(){
while(!q.empty()){
nod eg=q.top();q.pop();
int x=eg.x;
if(v[x]) continue;
v[x]=1;f[x]=eg.d;
for(reg int i=first[x];i;i=e[i].next){
int y=e[i].y;
if(f[y]>f[x]+e[i].d){
f[y]=f[x]+e[i].d;
q.push((nod){y,f[y]});
}
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&ST);
memset(v,0,sizeof(v));f[ST]=0;
for(reg int i=2;i<=n;++i) f[i]=1061109567;
for(reg int i=1;i<=m;++i){
scanf("%d%d%d",&s1,&s2,&s3);
ins(s1,s2,s3);
}
q.push((nod){ST,0});
dijkstra();
for(reg int i=1;i<=n;++i)
printf("%d ",f[i]>=1061109567?2147483647:f[i]);
}