正解:
假设要在一个地方卖出水晶球,那么要购买水晶球的价格尽量小才能卖出更高的价格。
设一个数组F,F[i]表示从1~i能携带的最小价格的水晶球。
先用一遍SPFA算出从节点1到每个节点携带水晶球的最小价格。
但是有可能会出现这样一种情况:
如果按照每一个节点的价格直接去减F[i],那么得出节点2卖得的价格是最优的,为99。
但是很明显我们可以看出,从节点2根本到不了终点。
所以我们可以想到,在每一个节点都进行一次BFS,看看能不能到终点。
但是,这样肯定会超时。
所以可以减少BFS的次数,先按照卖出的价钱把每个节点排序,之后从高到低依次BFS,如果发现能到终点就是答案。
但是,这样还是会超时70分。
再来看个图:
根据排好序的序列,发现点2利润最大。
于是从点2开始搜索,发现走不到终点,把经过的点标为走过。
这是我们发现,如果一个点到不了终点,那么这个点经过的点都到不了终点。
所以,我们就没有必要把走过的点初始化,而是直接搜索下一个点。