模拟链表SPFA...

今天上午刚AC掉自己的第一个模拟链表SPFA~是不是有点晚呢...发出来受BS一下...

program SPFA;
  type l=record
    x,y,q,n:integer;
  end;
  var
    d:array[1..100000]of l;
    e,dist:array[1..100000]of integer;
    nn,m,i,j:integer;
    v:array[1..100000]of boolean;
    x,y,z,o:integer;
    n,f,s:integer;
    q:array[1..1000]of integer;
    t,xx:integer;
  procedure add(x,y,z:integer);
    begin
      inc(o);
      d[o].x:=x;
      d[o].y:=y;
      d[o].q:=z;
      d[o].n:=e[x];
      e[x]:=o;
    end;
  begin
    readln(n,m);
    for i:=1 to m do
      begin
        readln(x,y,z);
        add(x,y,z);
        add(y,x,z);
      end;
    f:=1;
    s:=1;
    q[1]:=1;
    for i:=1 to n do
      dist[i]:=32767;
    dist[1]:=0;
    while f<=s do
      begin
        xx:=q[f];
        v[xx]:=false;
        t:=e[xx];
        while t<>0 do
          begin
            if(d[t].q+dist[xx]<dist[d[t].y])then
              begin
                dist[d[t].y]:=d[t].q+dist[xx];
                if not v[d[t].y] then
                  begin
                    v[d[t].y]:=true;
                    inc(s);
                    if s>n then s:=1;
                    q[s]:=d[t].y;
                  end;
              end;
            t:=d[t].n;
          end;
        inc(f);
        if f>n then f:=1;
      end;
    for i:=1 to n do
      writeln(dist[i]);
  end.

posted on 2010-11-18 16:36  saltless  阅读(440)  评论(4编辑  收藏  举报

导航