2516 2014年中山市选拔赛 dwarf tower

来源:互联网 发布:风暴英雄mac版下载 编辑:程序博客网 时间:2024/04/30 22:27

  • 题目
  • 题解
  • 代码

题目

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 l<r do    begin      inc(l);      u:=h[l];      i:=ls[u];      while i>0 do        begin          if a[u]+a[y[i]]<a[z[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.
1 0