#include<iostream>
#include<cstdio>
const int maxn=100000+10,maxm=1000000+10,oo=1000000000;
using namespace std;
int To[maxm],Next[maxm],w[maxm],Begin[maxn],d[maxn],p[maxn],q[maxn*10],e;
void add(int x,int y,int z){
To[++e]=y;
Next[e]=Begin[x];
Begin[x]=e;
w[e]=z;
}
int main(){
int i,j,k,m,n,s;
cin>>n>>m;
for(i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
for(i=1;i<=n;i++)d[i]=oo;
cin>>s;
int f=0,l=1;
q[f]=s;d[s]=0;p[s]=1;
while(f<l){
f++;
int v=q[f];
for(i=Begin[v];i;i=Next[i]){
int u=To[i];
if(d[u]>d[v]+w[i]){
d[u]=d[v]+w[i];
if(!p[u]){
q[++l]=u;
p[u]=1;
}
}
}
p[v]=0;
}
for(i=1;i<=n;i++)
if(d[i]<oo)printf("%d ",d[i]);
else printf("-1 ");
return 0;
}
<span style="font-size:32px;">made by 罗旅洲</span>
SPFA+链式前向星
最新推荐文章于 2021-06-18 23:54:51 发布