洛谷 P3371 【模板】单源最短路径

题目大意:
在一个有向图中,有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 headdo
                begin
                     inc(head);
                     i:=list[p[head]];
                     while i>0 do
                           begin
                               if dis[s[i]]+w[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.

你可能感兴趣的:(pascal,spfa,邻接表)