初中OJ1836. 【NOIP2009TG】最优贸易

本文介绍了一种用于寻找从起点到终点最优路径的算法。通过使用SPFA算法计算从起点到各节点的最小代价,并结合BFS算法判断是否可达终点,以此来确定最优解。文章还提出了一种优化方案,避免重复搜索无效节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正解:

假设要在一个地方卖出水晶球,那么要购买水晶球的价格尽量小才能卖出更高的价格。
设一个数组F,F[i]表示从1~i能携带的最小价格的水晶球。
先用一遍SPFA算出从节点1到每个节点携带水晶球的最小价格。
但是有可能会出现这样一种情况:
这里写图片描述
如果按照每一个节点的价格直接去减F[i],那么得出节点2卖得的价格是最优的,为99。
但是很明显我们可以看出,从节点2根本到不了终点。


所以我们可以想到,在每一个节点都进行一次BFS,看看能不能到终点。
但是,这样肯定会超时。
所以可以减少BFS的次数,先按照卖出的价钱把每个节点排序,之后从高到低依次BFS,如果发现能到终点就是答案。


但是,这样还是会超时70分。
再来看个图:
这里写图片描述
根据排好序的序列,发现点2利润最大。
于是从点2开始搜索,发现走不到终点,把经过的点标为走过。
这里写图片描述
这是我们发现,如果一个点到不了终点,那么这个点经过的点都到不了终点
所以,我们就没有必要把走过的点初始化,而是直接搜索下一个点。

这样就不会超时了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值