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

27 篇文章 0 订阅
17 篇文章 0 订阅

题目大意:
在一个有向图中,有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.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值