SSL P2721 极其简单的最短路问题

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

题目大意:
给出N个点,M条边,以及目标点T,求点1到T的最短路是多少。

30%:n<=10 m<=20
60%: n<=1000 m<=20000
100%: n<=5000000 m<=10000000

题解:
这题就是裸的spfa,没什么好说了,注意几点;
①无向边,建边要双向
②邻接表查询
③数组注意大小
④spfa
时间复杂度:O(N+M)

var
    next,s,t,w:array [0..10000001] of longint;
    list,dis:array [0..5000001] of longint;
    q:array [0..20000001] of longint;
    v:array [0..5000001] of boolean;
    i,j,n,m,k,x,y,z:longint;

procedure add(p1,p2,p3,p4:longint);
begin
    s[p4]:=p1;
    t[p4]:=p2;
    w[p4]:=p3;
    next[p4]:=list[p1];
    list[p1]:=p4;
end;

procedure spfa;
var
    i,head,tail:longint;
begin
    for i:=1 to n do
      dis[i]:=maxlongint;
    v[1]:=true;
    dis[1]:=0;
    q[1]:=1;
    head:=0;
    tail:=1;
    while head<tail do
    begin
        inc(head);
        i:=list[q[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 not(v[t[i]]) then
                       begin
                            v[t[i]]:=true;
                            inc(tail);
                            q[tail]:=t[i];
                       end;
                end;
             i:=next[i];
        end;
        v[q[head]]:=false;
    end;
end;

begin
    readln(n,m,k);
    j:=0;
    for i:=1 to m do
    begin
         readln(x,y,z);
         inc(j);
         add(x,y,z,j);
         inc(j); 
         add(y,x,z,j);
    end;
    spfa;
    writeln(dis[k]);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值