#include<iostream> #include<cstdlib> #include<cstdio> #include<algorithm> #include<queue> #include<cstring> using namespace std; queue<long long>q; long long v[1000010],minn[1000100]; long long n,m,s,lin[1000010],tot=0; struct min_road{ long long from,to,next,len; }e[1000010]; void add(long long f,long long t,long long l) { e[++tot].from=f; e[tot].to=t; e[tot].len=l; e[tot].next=lin[f]; lin[f]=tot; } int main() { scanf("%lld%lld%lld",&n,&m,&s); for(int i=1;i<=n;i++)minn[i]=2147483647; for(int i=1;i<=m;i++) { long long f,t,l; scanf("%lld%lld%lld",&f,&t,&l); add(f,t,l); } q.push(s); v[s]=1; minn[s]=0; while(!q.empty()) { long long cur=q.front(); q.pop(); v[cur]=0; for(long long i=lin[cur];i;i=e[i].next) { if(minn[e[i].to]>minn[cur]+e[i].len) { minn[e[i].to]=minn[cur]+e[i].len; if(!v[e[i].to]) { q.push(e[i].to); v[e[i].to]=1; } } } } for(int i=1;i<=n;i++) printf("%lld ",minn[i]); }
这就是SPFA的邻接表存法,用于变多的情况