题目大意: 在一个有向图中,有M条边(1<=M<=500000),N个点(1<=N<=10000),求点S到1~N个点的最短路径长度,无最短路就输出maxlongint。
spfa+队列优化: dis[i]表示点s到i的最短路径,一开始dis数组为maxlongint。 1.用队列优化,就可以省略枚举每个点的时间,由O(M^2)变成了O(M)。 2.跑一波spfa,然后输出就好了。
var list,s,t,w,next,p:array [0..500001] of longint; dis:array [0..10001] of longint; v:array [0..10001] of boolean; x,i,j,n,m,q:longint; procedure spfa; var head,tail,i:longint; begin head:=0; tail:=1; dis[q]:=0; v[q]:=true; p[1]:=q; while head<tail do begin inc(head); i:=list[p[head]]; while i>0 do begin if dis[s[i]]+w[i]<dis[t[i]] then begin dis[t[i]]:=dis[s[i]]+w[i]; if v[t[i]]=false then begin v[t[i]]:=true; inc(tail); p[tail]:=t[i]; end; end; i:=next[i]; end; v[p[head]]:=false; end; end; begin readln(n,m,q); for i:=1 to m do begin readln(s[i],t[i],w[i]); next[i]:=list[s[i]]; list[s[i]]:=i; end; for i:=1 to n do begin dis[i]:=maxlongint; v[i]:=false; end; spfa; for i:=1 to n do write(dis[i],' '); end.