2516 2014年中山市选拔赛 dwarf tower

17 篇文章 0 订阅
11 篇文章 0 订阅

题目

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值