bzoj1001 spfa

const  
  maxn=2000009;  

var  
  s,t,n,m,e:longint;  
  last,d,state:array[0..maxn] of longint;  
  side:array[1..maxn*3] of record  
    x,y,z,next:longint;  
  end;  
  v:array[0..maxn] of boolean;  
  flag:boolean;  

procedure add(x,y,z:longint);  
begin  
  inc(e);  
  side[e].x:=x; side[e].y:=y; side[e].z:=z;  
  side[e].next:=last[x]; last[x]:=e;  
  inc(e);  
  side[e].x:=y; side[e].y:=x; side[e].z:=z;  
  side[e].next:=last[y]; last[y]:=e;  
end;  

procedure init;  
var  
  i,j,ans,x:longint;  
begin  
  ans:=maxlongint;  
  readln(n,m);  
  flag:=true;  
  if (n=1)or(m=1) then flag:=false;  
  if (n=1)and(m=1) then  
  begin  
    writeln(0);  
    exit;  
  end;  
  if n=1 then  
  begin  
    for i:=1 to m-1 do  
    begin  
      read(x);  
      if x<ans then ans:=x;  
    end;  
    writeln(ans);  
    exit;  
  end;  
  if m=1 then  
  begin  
    for i:=1 to n-1 do  
    begin  
      read(x);  
      if x<ans then ans:=x;  
    end;  
    writeln(ans);  
    exit;  
  end;  
  s:=0;  
  t:=2*(n-1)*(m-1)+1;  
  for i:=1 to m-1 do  
  begin  
    read(x);  
    add(i*2,t,x);  
  end;  
  for i:=2 to n-1 do  
    for j:=1 to m-1 do  
    begin  
      read(x);  
      add(2*(i-1)*(m-1)+j*2,2*(i-2)*(m-1)+j*2-1,x);  
    end;  
  for i:=1 to m-1 do  
  begin  
    read(x);  
    add(s,2*(n-2)*(m-1)+i*2-1,x)  
  end;  
  for i:=1 to n-1 do  
  begin  
    read(x);  
    add(s,2*(i-1)*(m-1)+1,x);  
    for j:=2 to m-1 do  
    begin  
      read(x);  
      add(2*(i-1)*(m-1)+2*j-1,2*(i-1)*(m-1)+2*(j-1),x);  
    end;  
    read(x);  
    add(t,2*(i-1)*(m-1)+2*m-2,x);  
  end;  
  for i:=1 to n-1 do  
    for j:=1 to m-1 do  
    begin  
      read(x);  
      add(2*(i-1)*(m-1)+2*j-1,2*(i-1)*(m-1)+2*j,x);  
    end;  
end;  

procedure spfa;  
var  
  head,tail,i,u:longint;  
begin  
  fillchar(d,sizeof(d),$7f div 3);  
  d[s]:=0;  
  fillchar(v,sizeof(v),true);  
  v[s]:=false;  
  head:=0;  
  tail:=1;  
  state[1]:=s;  
  repeat  
    inc(head);  
    if head>t+7 then head:=1;  
    u:=state[head];  
    i:=last[u];  
    while i>0 do  
      with side[i] do  
      begin  
        if d[x]+z<d[y] then  
        begin  
          d[y]:=d[x]+z;  
          if v[y] then  
          begin  
            v[y]:=false;  
            inc(tail);  
            if tail>t+7 then tail:=1;  
            state[tail]:=y;  
          end;  
        end;  
        i:=next;  
      end;  
    v[u]:=true;  
  until head=tail;  
  writeln(d[t]);  
end;  

begin  
  init;  
  if flag then spfa;  
end.  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值