一、内容

 某天超市搞活动,小明想买一个自己一直想买的电脑,平时需要7000,小明觉得太贵了。但活动当天,超市里的商品可以通过买其他商品获得优惠券。例如买一个键盘然后买电脑只需要5000,如果买一个鼠标买电脑只需要4000。同理,买其他商品也有这样的优惠活动。但商场出于某种目的,给每一件商品都标了等级,如果买了低于某个等级的商品,就不能够再买某些高级商品。
为了方便,商店将每一件商品从1开始编号,电脑的编号为1.每一件商品都有对应的价格p,等级l,以及所对应的优惠商品Ki和优惠价格Ri。如果两件商品等级差超过D,就不能同时购买。小明想用最少的钱买到电脑。

Input

第一行是两个整数D,t(1 <= t <= 100),分别代表等级的差距限制和商品的数量。接下来按照编号从1到t给出商品的描述。每个商品的描述开头是v、e、m(m < t),表示该物品的价格、商品的等级和对应优惠商品总数。接下来m行每行包括两个整数K和R,分别表示优惠商品的编号和对应商品优惠后价格。

Output

输出最少需要的钱。

Sample Input

2 4
7000 2 2
2 5000
3 4000
500 1 0
1000 2 1
4  100
30 2 0

Sample Output

4130

二、思路

  • 建立一个超级源点0,从0建立一条边到每个物品,权值为物品的价值。代表花费多少钱就可以购买这个物品
  • 若某个物品拥有替代品,代表从替代品建立一条边到这个物品,价值为替代的价值。 代表我有了这个替代品,那么还需要花费多少就能买这个物品。
  • 最后就是等级制度。我们可以枚举每个等级区间,每次求最短路是只能更新在这个区间里面的物品。枚举所有情况求一个最小值就可以了。 特别注意的是区间必须包含1点。 那么范围就是【L[1] - m, L[1]】

三、代码

#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 105, M = 1e4 + 5, INF = 0x3f3f3f3f;
struct E {int v, w, next;
} e[M];
int k, n, x, u, v, w, maxL = INF, len = 1, L[N], h[N], d[N];//L[i]代表i的等级
bool vis[N];
void add(int u, int v, int w) {e[len].v = v;e[len].w = w;e[len].next = h[u];h[u] = len++;
}
void spfa(int l, int r) {memset(d, 0x3f, sizeof(d));d[0] = 0;queue<int> q;q.push(0);while (!q.empty()) {int u = q.front();q.pop();vis[u] = false;for (int j = h[u]; j; j = e[j].next) {int v = e[j].v;int w = e[j].w + d[u];if (l <= L[v] && L[v] <= r && d[v] > w) {d[v] = w;if (!vis[v]) vis[v] = true, q.push(v);}}}
}
int main() {scanf("%d%d", &k, &n);for (int u = 1; u <= n; u++) {scanf("%d%d%d", &w, &L[u], &x);maxL = max(maxL, L[u]);add(0, u, w);//0号点花费w的价值就可以买while (x--) {scanf("%d%d", &v, &w);add(v, u, w); //v-->u 有了v花费w就可以买u } }//枚举下等级范围 求出最小的ansint ans = INF;for (int i = L[1] - k; i <= L[1]; i++) { //等级范围 肯定是要包含1点的 不然你连1都无法购买 //可以和[i, i + k]区间的人交易spfa(i, i + k);ans = min(d[1], ans); } printf("%d", ans);return 0;
}

POJ 1062 昂贵的聘礼相关推荐

  1. POJ 1062 昂贵的聘礼【经典的最短路问题】

    原题链接:http://poj.org/problem?id=1062 我的链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=19651 ...

  2. 解题报告:POJ - 1062 昂贵的聘礼(最短路、超级源点)

    整理的算法模板合集: ACM模板 AcWing 903. 昂贵的聘礼 [思路] 由于本题只有终点,没有起点,所以我们建一个超级源点S=0S = 0S=0 ,源点与各各点的权值就是他们的价格 如下图所示 ...

  3. POJ 1062 昂贵的聘礼

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30252   Accepted: 8465 Descriptio ...

  4. POJ 1062 昂贵的聘礼 (dijkstra)

    昂贵的聘礼 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说 ...

  5. POJ #1062 昂贵的聘礼 有限制的最短路 枚举+dijkstra求最短路

    Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...

  6. POJ 1062.昂贵的聘礼

    Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...

  7. POJ - 1062 昂贵的聘礼

    题目链接 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请 ...

  8. * poj 1062 昂贵的礼物 dijkstra 枚举区间

    思路参考大佬 https://blog.csdn.net/lyy289065406/article/details/6645852 每个物品看成一个节点,酋长的允诺也看作一个物品, 如果一个物品加上金 ...

  9. PKU 1062 昂贵的聘礼

    /* 枚举等级范围, 每种情况求最短路 */ #include <iostream> #include <queue> #define MAXN 101 using names ...

最新文章

  1. 教师教学的“五个转化”能力
  2. 4固定在底部_自建房不搭彩钢棚,4根钢结构撑个玻璃棚遮风挡雨,上面多个露台...
  3. 016_泛型常见通配符
  4. 转载--CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡
  5. Inductive Robust Principal Component Analysis
  6. Python基础-小程序练习(跳出多层循环,购物车,多级菜单,用户登录)
  7. synchronized的使用和底层原理、锁状态的膨胀升级过程
  8. STM32工作笔记0022---STM32F1开发版 GPIO口工作原理
  9. [译] 用 Swift 创建自定义的键盘
  10. 一不小心就进入了P2P陷阱
  11. Spring框架的本质:4那些高曝光率的Annotation
  12. 模块EMERSONDELTAVSLS1508/本特利330400-02-CN
  13. 基于Java Web的房屋出租管理系统
  14. 牛腩新闻系统--.NET使用一般处理程序生成验证码
  15. 2023年春招热门笔试算法题(C++)
  16. Krita学习——Qt学习笔记(一)
  17. 包围盒----碰撞检测
  18. RFC3261 SIP: Session Initiation Protocol 中文版 翻译中
  19. VB初学者实例50例
  20. 不用迭代算法而快速实现的jsp树结构

热门文章

  1. 《道德情操论》与《中庸》--《可以…
  2. 基于Java毕业设计在线交友系统2021源码+系统+mysql+lw文档+部署软件
  3. linux下的阻塞和非阻塞
  4. 安卓硬编音视频数据推送到rtmp服务器
  5. android sdk manager 闪退现象的解决方法
  6. Sqlserver根据当前时间生成17位时间流水号
  7. 设计模式之迭代器模式
  8. Kali渗透测试:使用Armitage扫描网络
  9. IDEA中文乱码怎么办
  10. 将字符转换为16进制数