您的位置:首页 > 其它

2516 2014年中山市选拔赛 dwarf tower

2017-04-01 19:15 288 查看
题目

题解

代码

题目

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: