poj 1062 Dijkstrul算法

题目链接:http://poj.org/problem?id=1062

题目大意:一个探险家为了要娶酋长的女儿,必须用一定的金钱和某种物品去换,而物品的拥有者也要用一定的金钱和另外的物品来换取,换取条件是交换者之间的等级不能直接或间接的大于某个数,现在要求探险家娶到酋长女儿能够用到的最小的金钱数

思路:若两种物品间可以用某种转换关系,则用有向边连接,边的权值即为交换的费用,然后在给定的等级交换范围内,求所需的最小金钱

注意:每个物品为一个节点。酋长所要物品为源节点。求源节点到其它节点的最短路径。结果是到所有节点最短路径加上物品价值和的最小值。说几点需要注意的问题:
 1、等级的处理:题中规定等级超过m的物品不可以交换,包括间接交换。比如a、b、c等级为1、2、3,如果等级限制为1的话,不可以通过a换b,b再换c这种方式,因为a与c的等级超过1。所以如果单次dijkstra求最短路径时,我们很难确定是否加入非集合S的的节点,因为不清楚当前节点是否满足等级要求,或者是否对未来要加入节点等级造成影响。所以目前采用的是枚举范围的方法,有一个事情我们是确定的,即初始节点的等级一定是在等级范围里的。所以我们枚举(lev[s]-m, lev[s])到(lev[s],lev[s]+m)等级范围。在处理最短路径新加入节点时要求节点等级大于等于最低等级,小于等于最高等级。
 2、有向图问题:A物品可以用B物品和C个金币代替,表示A到B的边权为C,但是并不说明B到A也有一条权为C的边,注意!
 3、初始化问题:既然要多次运行dijkstra,那么最小路径长度一定要初始化。我前几次WA就是错在这里,因为每次dijstra数据具有相似性,所以好多数据都检查不出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值