Full Tank? POJ - 3635

Full Tank

POJ - 3635
题目传送门

题目大意

有n个城市和m条道路(n<=1000 m<=10000),构成一张无向图。在每个城市里面有一个加油站,不同加油站加个不同。通过一条道路的油耗就是该道路的边权。现在给q个询问(q<=100),每次提问给出c为油箱最大容量,s为起点,t为终点。求s到t至少需要花多少油钱?(初始时油箱为空)

思路

这是一道边权不全为1的bfs题。在这个状态图中不同状态的转移价值不同,因此我们不能使用普通的bfs来完成,而可以使用优先队列来完成,保证队列中的状态的花费具有单调性。那么第一次终点t出队时就是它的最小花费。
优先队列保证花费最小的状态先出队。
首先我们考虑一个状态可以用(city,fuel)来表示,即只需要记录其当前所在城市和当前剩余油量,这样即可有效判重。这样对于每一个状态,我们有两种扩展方式
1.如果fuel<c,那么我们可以加一升油,并将新状态(city,fuel+1)入队(通过很多次的fule+1可以加到任意值),同时花费cost[city]
2,对于每条从当前city出发的边,如果当前fule>w边权,则前往下一个城市,并入队(next,fule-w)
这样我们不断的取出优先队列队首(顶)的元素进行扩展,当t第一次被取出时就是最小的花费

代码

#include <algorithm>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值