codevs1021

来源:互联网 发布:怎样网上开通中银淘宝 编辑:程序博客网 时间:2024/05/23 15:37

题目地址:http://codevs.cn/problem/1021/

分析:

spfa

代码:

const
  maxn=1000;
  maxe=1000000;
var
  d,h,q:array[0..2*maxn]of longint;
  v,next,w,pre:array[1..2*maxe]of longint;
  f:array[1..maxn]of boolean;
  n,m,start,i,k,j,tot,t:longint;
function max(a,b:longint):longint;
  begin
    if a>b then exit(a) else exit(b);
  end;
procedure init;
  var x,y,z,i:longint;
  begin
    readln(n,m);
    for i:=1 to m do
      begin
        readln(x,y,z);
        v[i]:=y;
        w[i]:=z;
        next[i]:=h[x];
        h[x]:=i;
        v[i+m]:=x;
        w[i+m]:=z;
        next[i+m]:=h[y];
        h[y]:=i+m;
      end;
    start:=1;
  end;
procedure dfs(i:longint);
  begin
    if i<>1 then dfs(pre[i]);
    write(i,' ',w[i],' ');
  end;
procedure spfa;
  var head,tail,i,p:longint;
  begin
    fillchar(q,sizeof(q),0);
    fillchar(d,sizeof(d),$7f);
    head:=0;
    tail:=1;
    q[1]:=start;
    f[start]:=true;
    d[start]:=0;
    while head<>tail do
      begin
        head:=(head+1)mod maxn;
        i:=q[head];
        f[i]:=false;
        p:=h[i];
        while p>0 do
          begin
            if d[v[p]]>d[i]+w[p] then
              begin
                d[v[p]]:=d[i]+w[p];
                if not f[v[p]]then
                  begin
                    tail:=(tail+1)mod maxn;
                    q[tail]:=v[p];
                    f[v[p]]:=true;
                  end;
                pre[v[p]]:=i;
              end;
            p:=next[p];
          end;
      end;
  end;
procedure work;
  var head,tail,p,i:longint;
  begin
    fillchar(q,sizeof(q),0);
    fillchar(d,sizeof(d),$7f);
    head:=0;
    tail:=1;
    q[1]:=start;
    f[start]:=true;
    d[start]:=0;
    while head<>tail do
      begin
        head:=(head+1)mod maxn;
        i:=q[head];
        f[i]:=false;
        p:=h[i];
        while p>0 do
          begin
            if d[v[p]]>d[i]+w[p] then
              begin
                d[v[p]]:=d[i]+w[p];
                if not f[v[p]]then
                  begin
                    tail:=(tail+1)mod maxn;
                    q[tail]:=v[p];
                    f[v[p]]:=true;
                  end;
              end;
            p:=next[p];
          end;
      end;
    tot:=max(tot,d[n]);
  end;
begin
  tot:=0;
  init;
  spfa;
  k:=n;
  while k<>1 do
    begin
      j:=pre[k];                                             //开pre数组记录所经过的节点
      t:=h[j];
      while v[t]<>k do t:=next[t];
      i:=w[t];
      w[t]:=maxlongint div 2;
      work;
      w[t]:=i;
      k:=pre[k];
    end;
  writeln(tot);
end.   

0 0
原创粉丝点击