dijkstra算法的较复杂运用——昂贵的聘礼题解[POJ-1062]

一些开头想说的话

好久不见!我是原来B站上的@非知名科技区UP。最近我决定将写文章的主阵地转移到CSDN上来。主要是因为B站专栏上的代码块的缺陷实在让人难以接受,另外一点呢就是在CSDN上的代码块用着方便,也方便大家把代码复制到DEV C++或者Xcode上,进行学习借鉴。但是有一点可惜的就是CSDN上并没有音频文件的插入也就意味着开头的音乐没有了,实在遗憾。那么我就放一张自己拍的图来暂时替代一下吧~今天的题解保证AC,但应该不是计算量最少的题解,已经AC想要冲刺最短时间解题的OI同仁请选择性地借鉴和学习。

今日份的题目

年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。
酋长说:“嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。”
探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。
探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。
不过探险家没必要用多样东西去换一样东西,因为不会得到更低的价格。探险家现在很需要你的帮忙,让他用最少的金币娶到自己的心上人。
另外他要告诉你的是,在这个部落里,等级观念十分森严。地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。他是一个外来人,所以可以不受这些限制。但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是直接接触,反过来也一样。因此你需要在考虑所有的情况以后给他提供一个最好的方案。
为了方便起见,我们把所有的物品从1开始进行编号,酋长的允诺也看作一个物品,并且编号总是1。每个物品都有对应的价格P,主人的地位等级L,以及一系列的替代品Ti和该替代品所对应的"优惠"Vi。如果两人地位等级差距超过了M,就不能"间接交易"。你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。
【输入文件】
输入第一行是两个整数M(1<=M<=100),N(1 <= N <= 400),依次表示地位等级差距限制和物品的总数。
接下来按照编号从小到大依次给出了N个物品的描述。每个物品的描述开头是三个非负整数P、L、X(X < N),依次表示该物品的价格、主人的地位等级和替代品总数。
接下来X行每行包括两个整数T和V,分别表示替代品的编号和"优惠价格"。
【输出文件】
输出最少需要的金币数。

示例输入

1 4
10000 3 2
2 8000
3 5000
1000 2 1
4 200
3000 2 1
4 200
50 2 0

示例输出

5250

这文字量······看着就让人头疼啊!个人觉得这有点像印度的种姓制度。其实这一整段话的意思就是我们会输入一堆物品,探险家购买物品的时候所购买的物品的主人等级极差不得超过限定的数字。即如果两个人如果等级差距太大,那么你先买高级人的东西再买低级人的东西和你先买低级人的东西再买高级人的东西是一样不可行的。而且探险家最后保证会和首长发生交易(首长的等级真不一定是最高的),也就是像下面这张图一样。如图,如果等级差距限制为1,那么买过黑色区域人和蓝色区域人的物品的人绝对买不到首长的女儿。如图,如果等级差距限制为1,那么买过黑色区域人和蓝色区域人的物品的人绝对买不到首长的女儿
所以,和首长等级差距太大的节点请试图忽略。
在经过上面的一番削减之后,可能有些点的数据就足够让我们去通过一般的dijkstra进行解决了,但是更大部分的测试点却仍然受到等级差距的影响。因为在最坏的情况下剩余可交易人群中的极差依然是等级差距限制的两倍。这种情况就会比较尴尬。
如果我们采用最基础的方法,将等级的区间从低到高进行遍历式的dijkstra可以吗?在我决定进行遍历之前,我们先进行一个简单的计算量分析。
400个节点均匀分布在200个层级上,首长100级,M=100。
一次dijkstra计算量O(2*n^2)=80000 。运行100次算法,最后的总量是8的6次方,远低于OI竞赛中10的8次方运算量要求,可以进行遍历。
在这个问题中,输入和图的邻接矩阵、邻接表构建个人认为不存在难点。主要是将探险家的出发点定位为0,所有物品都可以和0连接。只是价格上一般不是最优解。如果存在替代品关系,则应使用一条距离为优惠价格的边进行连接。
文章的最后,放出代码`

#include<iostream>//
#include<cstdio>
#include<c
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值