ssl2339 分糖果 spfa

题目大意

  给一个无向图(点数1<=n<=100000 ),求从起点到那一个点的最短路最长,并输出路径长度。

分析

 就是一个赤裸裸的spfa吗!

代码

const
  maxe=100000;
  maxv=2000000;

type
  arr=record
    x,y,w,next:longint;
  end;

var
  n,m,s,q:longint;
  ls:array[1..maxe] of longint;
  a:array[1..maxv] of arr;
  f:array[1..maxe] of longint;
  v:array[1..maxe] of longint;
  d:array[1..maxe] of longint;
  i,j,k:longint;
  ans:longint;

procedure spfa;
var
  i,j,k:longint;
  head,tail:longint;
begin
  fillchar(f,sizeof(f),$7f);
  head:=0;
  tail:=1;
  v[s]:=1;
  d[1]:=s;
  f[s]:=1;
  repeat
    head:=head mod maxe+1;
    j:=ls[d[head]];
    while j<>0 do
      begin
        with a[j] do
          begin
            if f[x]+w<f[y]
              then
                begin
                  f[y]:=f[x]+w;
                  if v[y]=0
                    then
                      begin
                        tail:=tail mod maxe+1;
                        d[tail]:=y;
                        v[y]:=1;
                      end;
                end;
            j:=next;
          end;
      end;
    v[d[head]]:=0;
  until head=tail;
end;

begin
  assign(input,'spfa.in');
  assign(output,'spfa.out');
  rewrite(output);
  reset(input);
  readln(n,m,s);
  readln(q);
  fillchar(ls,sizeof(ls),0);
  for i:=1 to m do
    begin
      with a[i*2-1] do
        begin
          readln(x,y);
          w:=1;
          next:=ls[x];
          ls[x]:=i*2-1;
        end;
      a[i*2].x:=a[i*2-1].y;
      a[i*2].y:=a[i*2-1].x;
      a[i*2].w:=1;
      a[i*2].next:=ls[a[i*2].x];
      ls[a[i*2].x]:=i*2;
    end;
  spfa;
  ans:=0;
  for i:=1 to n do
    if f[i]>ans then ans:=f[i];
  write(ans+q);
  close(input);
  close(output);
end.


 

posted @ 2016-04-13 18:06  一个响亮的蒟蒻  阅读(166)  评论(0编辑  收藏  举报