2516 2014年中山市选拔赛 dwarf tower

  • 题目
  • 题解
  • 代码

题目

Vasya在玩一个叫做”Dwarf Tower”的游戏,这个游戏中有n个不同的物品,它们的编号为1到n。现在Vasya想得到编号为1的物品。
获得一个物品有两种方式:
1. 直接购买该物品,第i件物品花费的钱为ci
2. 用两件其他物品合成所需的物品,一共有m种合成方式。
请帮助Vasya用最少的钱获得编号为1的物品。

题解

一个有向图,每种合成方式都弄成两条边,然后spfa
时间复杂度O(nm)

代码

var
  a:array[1..10000]of longint;
  h:array[1..1000000]of longint;
  z,x,y,ls,next:array[1..200000]of longint;
  v:array[1..200000]of boolean;
  n,m,i,j,k,r:longint;

procedure spfa;
var
  u,l,i,j:longint;
begin
  l:=0;
  while ldo
    begin
      inc(l);
      u:=h[l];
      i:=ls[u];
      while i>0 do
        begin
          if a[u]+a[y[i]]then
            begin
              a[z[i]]:=a[u]+a[y[i]];
              if v[z[i]] then
                begin
                  v[z[i]]:=false;
                  inc(r);
                  h[r]:=z[i];
                end;
            end;
          i:=next[i];
        end;
      v[u]:=true;
    end;
end;

begin
  readln(n,m);
  for i:=1 to n do
    read(a[i]);
  fillchar(v,sizeof(v),true);
  for i:=1 to m do
    begin
      readln(z[i*2-1],x[i*2-1],y[i*2-1]);
      next[i*2-1]:=ls[x[i*2-1]];
      ls[x[i*2-1]]:=i*2-1;
      z[i*2]:=z[i*2-1];x[i*2]:=y[i*2-1];y[i*2]:=x[i*2-1];
      next[i*2]:=ls[x[i*2]];
      ls[x[i*2]]:=i*2;
      if v[x[i*2]] then
        begin
          inc(r);
          h[r]:=x[i*2];
          v[x[i*2]]:=false;
        end;
      if v[y[i*2]] then
        begin
          inc(r);
          h[r]:=y[i*2];
          v[y[i*2]]:=false;
        end;
    end;
  spfa;
  writeln(a[1]);
end.


你可能感兴趣的:(最短路,链表,spfa)