【日常学习】【条件最短路dij】POJ1062 昂贵的聘礼(2002年浙江

耗时三节课 充分体现出粗心酿成大错这个道理 一开始一直不知道为什么数组越界 原来是minn和ninj写反了 后来又因为读入函数出问题 反复调试 今后一定要注意

题目还是放上吧:

题目描述Description

年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用

为了方便起见,我们把所有的物品从

输入描述Input Description

输入包括了多个测试数据。每个测试数据的第一行是两个整数

输出描述Output Description

对于每个测试数据,在单独一行内输出最少需要的金币数。

样例输入Sample Input

14

1000032 //酋长的允诺

28000

35000

100021 //大祭司的皮袄

4200

300021 //大祭司的水晶球

4200

5020 // 其他某件物品

样例输出Sample Output

5250

很容易想到构造一个图,图的各节点就是各个物品,权值就是优惠后的价格 把商人设置为0.,找到1的最短路即可。由于受到等级限制,经过的节点必须和1的等级相差不超过m,那么对于每个上下相差值为m的区间查找最短路即可,最后取最小值。

方便大家理解,画了一张很拙劣的图,大家凑活看一下

代码放上:

在这里还要特别说明一下大整数常量的定义

constint

这真是极好的存在= =引用一下一篇已经消失的博文的解释(顺便吐槽域名重定向去了什么鬼地方):

0x3f3f3f3f的十进制是1061109567,也就是10^9级别的(和0x7fffffff一个数量级),而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。最后,0x3f3f3f3f还能给我们带来一个意想不到的额外好处:如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a))这样的代码来实现(方便而高效),但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),就不能使用memset函数而得自己写循环了(写这些不重要的代码真的很痛苦),我们知道这是因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0,现在好了,,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。所以在通常的场合下,0x3f3f3f3f真的是一个非常棒的选择。总结起来就是三句话1 够大,一般这么大你不会用到2 够大但不容易溢出3 方便数组赋值(如果你用FF会变成负数,符号位也会成1)

一轮开始了,该来的总会来的。

欢迎小花加入C党大家族,本科同学你现在是一个人了,摸头···祝小花的喜家家之路一帆风顺。

——君子博学而日参省乎己,则知明而行无过矣。

这几年大多是昆明空运来的,

【日常学习】【条件最短路dij】POJ1062 昂贵的聘礼(2002年浙江

相关文章:

你感兴趣的文章:

标签云: