2516 2014年中山市选拔赛 dwarf tower
2017-04-01 19:15
288 查看
题目
题解
代码
获得一个物品有两种方式:
1. 直接购买该物品,第i件物品花费的钱为ci
2. 用两件其他物品合成所需的物品,一共有m种合成方式。
请帮助Vasya用最少的钱获得编号为1的物品。
时间复杂度O(nm)
题解
代码
题目
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.
相关文章推荐
- 2014年中山市选拔赛 dwarf tower
- 2515 2014年中山市选拔赛 投票
- SSL P2515 2014年中山市选拔赛 投票
- SSL P2516 2014年中山市选拔赛 dwarf tower
- 2014年中山市选拔赛 投票
- 2014年广东省青少年信息学竞赛中山市选拔赛 投票
- SSL2522 2014年汕头市选拔赛普级组 约数(线性筛素数)
- SSL2520 2014年汕头市选拔赛普级组 小球(math)
- 2014年第四届“华为杯”南邮大学生程序设计竞赛之选拔赛 D演唱顺序问题
- CSU-ACM2014年校队选拔赛指导赛解题报告
- 2014年汕头市选拔赛普级组 数数
- JZOJsenior3587.【中山市选2014】dwarf tower
- jzoj3587 【中山市选2014】dwarf tower
- SSL 2521 2014年汕头市选拔赛普级组 数数
- 2014年广州市信息学尖子选拔赛 第一题
- 总结(【中山市选2014】投票 【中山市选2014】dwarf tower 【中山市选2014】图 【NOIP2013提高组day2】华容道)
- 东莞市2014年市队选拔赛 分组 构造二分图最小覆盖方案
- POJ 2516 Minimum Cost 最小花费最大流+多次求解
- 新生选拔赛暂存
- 华东交通大学2016届新生选拔赛:1010 我是签到题