您的位置:首页 > 其它

洛谷P3371 单源最短路径(spfa)

2017-03-07 21:25 316 查看



【模板】单源最短路径


题目描述

如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。


输入输出格式

输入格式:

第一行包含三个整数N、M、S,分别表示点的个数、有向边的个数、出发点的编号。

接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条有向边的出发点、目标点和长度。

输出格式:

一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为2147483647)

分析:spfa模版。

代码

const

  maxn=1000000;

var

  ls,s,d,next:array[0..maxn] of int64;

  v:array[0..maxn] of boolean;

  a:array[0..maxn,1..3] of longint;

  i,j,n,m,k:longint;

procedure spfa;

var

  head,tail,i:longint;

begin

  head:=0;

  tail:=1;

  s[1]:=k;

  v[k]:=true;

  while head<tail do

    begin

      inc(head);

      i:=ls[s[head]];

      while i>0 do

        begin

          if d[a[i,1]]+a[i,3]<d[a[i,2]] then

            begin

              d[a[i,2]]:=d[a[i,1]]+a[i,3];

              if not v[a[i,2]] then

                begin

                  v[a[i,2]]:=true;

                  inc(tail);

                  s[tail]:=a[i,2];

                end;

            end;

          i:=next[i];

        end;

      v[s[head]]:=false;

    end;

end;

begin

  readln(n,m,k);

  for i:=1 to n do

    d[i]:=maxlongint;

  d[k]:=0;

  for i:=1 to m do

    begin

      readln(a[i,1],a[i,2],a[i,3]);

      next[i]:=ls[a[i,1]];

      ls[a[i,1]]:=i;

    end;

  spfa;

  for i:=1 to n do

    write(d[i],' ');

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: