题目链接:
http://poj.org/problem?id=1062
中文题目,就不说题意了.
分析:
很好的一道题。两个关键:一是建图,而是处理等级限制的问题。
建图的话,结点为每件物品,把探险者也看成一个入度为零的节点,是n + 1结点之一,我把他的标号设为0,探险者到其他物品的直接连线的权值为物品的原始价格,其他 i -> j的边的权值为探险者获得i后换j的优惠价格。
题目又要求最短路中的所有点的等级在一个区间内[a,b],如果能够很好的给出这个区间的话,只要
对图中的点进行筛选即可了。
从题意中我们知道,最后所有的最短路都会汇集在1号点,也就是说1号点是所有最短路都存在的点,好了,这个条件很重要,这样我们就可以依照1号点来给定区间了,比如1号点等级为lev,那么也就是说在所有最短路的这些点都必须满足在[lev-M,lev+M]这个区间里面。但是如果在这个区间内出现的两个点的他们之间的等级差超过了M值(这是存在的),显然,不符合题意了,所以这个区间还要继续缩小。其实只要稍微动动脑子,就可以找出这样的区间[lev-M,lev],[lev-M+1,lev+1],... ...,[lev,lev+M],首先这些区间都满足大区间的条件,而且如果将这些区间的某个作为筛选条件的话,在这个区间内的任意两个点的等级都不会超过M值,这是本题的精华所在。
好了,讲完了,只需枚举区间,然后筛选点,求最短路就行了。
#include
#include
#include
#include
#include
#include
#include
#include
#include