Description


年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。不过探险家没必要用多样东西去换一样东西,因为不会得到更低的价格。探险家现在很需要你的帮忙,让他用最少的金币娶到自己的心上人。另外他要告诉你的是,在这个部落里,等级观念十分森严。地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。他是一个外来人,所以可以不受这些限制。但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。因此你需要在考虑所有的情况以后给他提供一个最好的方案。

为了方便起见,我们把所有的物品从1开始进行编号,酋长的允诺也看作一个物品,并且编号总是1。每个物品都有对应的价格P,主人的地位等级L,以及一系列的替代品Ti和该替代品所对应的"优惠"Vi。如果两人地位等级差距超过了M,就不能"间接交易"。你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。 

Input

输入第一行是两个整数M,N(1 <= N <= 100),依次表示地位等级差距限制和物品的总数。接下来按照编号从小到大依次给出了N个物品的描述。每个物品的描述开头是三个非负整数P、L、X(X < N),依次表示该物品的价格、主人的地位等级和替代品总数。接下来X行每行包括两个整数T和V,分别表示替代品的编号和"优惠价格"。

Output

输出最少需要的金币数。

Sample Input

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

Sample Output

5250

  更多的测试用例:POJ DISCUSS

思路


  这道题的关键点有两个:图的构建与物品能进行交换的等级区间。

  对于前一个问题,需要以探险家作为起始点,设其编号为0,暂且计各物品编号为顶点编号,物品为各顶点,由于探险家可以用金币买各个物品,所以 0 点可以直接到达其余各点,边的权为购买该物品的金币数;而物品 i 与物品 j 间可能进行交换,所以让 i -> j 表示用“物品 j + 物品 i 优惠后的价格 = 物品 i” 。而原问题—— ”探险家化最少的金币买到酋长的诺言“ 也就转换成了求 0 点 到 1 点的最短路。

  原问题在交换物品时还有另外一个要求:两两交换的物品的地位不能相差 M 且所有经交换的物品的地位不能相差 M 。顺着这个思路,我们一开始可能会以酋长为最高等级 level,取等级在区间 [ level - M, level ] 中的物品进行交换,而剔除区间之外的物品。但是忽略了一个问题:酋长可能不是最高等级! 这个问题也很好理解,比如酋长的爸爸、酋长的爷爷...等等的等级就可能比酋长还高。那么就会想把区间扩展到 [ level - M, level + M ]  。但是在这个区间中的两件物品相差可能会超过 M,比如等级为 level - M 的物品与 level + 1 的物品它们的等级差距为 M+1 。那么我们就需要从 [ level - M, level ] 开始到 [lev, lev + M ] 结束,穷举区间,记录最小的最短路。

  

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define INF 0x3f3f3f3f
int M, N; //最大等级差距与物品数
const int MAX_N = 110;
struct Edge{int to;int cost;Edge(int tt, int cc) : to(tt), cost(cc) {}
};
vector<Edge> G[MAX_N];void addEdge (const int& u, const int& v, const int& w) {G[u].push_back(Edge(v, w));
}struct Node{int id;int cost;friend bool operator < (const Node& a, const Node& b) {return a.cost > b.cost;}
}dis[MAX_N];
bool visit[MAX_N];
int level[MAX_N];
bool outlevel[MAX_N];
void dijkstra(const int& s) {for (int i = 0; i <= N; i++) dis[i].id = i, dis[i].cost = INF;dis[0].id = 0, dis[0].cost = 0; for (int i = 0; i <= N; i++) visit[i] = false;priority_queue<Node> pQueue;pQueue.push(dis[0]);while(!pQueue.empty()) {int u = pQueue.top().id; pQueue.pop();if (visit[u]) continue;visit[u] = true;for (int j = 0; j < G[u].size(); j++) {int v = G[u][j].to;int cost = G[u][j].cost;if (!outlevel[v] && dis[v].cost > dis[u].cost + cost ) {dis[v].cost =  dis[u].cost + cost;pQueue.push(dis[v]);}}}
}int main(void) {cin >> M >> N;for (int i = 0; i <= N; i++) G[i].clear();for (int i = 1; i <= N; i++) {int P, L, X;cin >> P >> L >> X;level[i] = L;addEdge(0, i, P); //探险家可直接买物品//以物抵金币for (int j = 1; j <= X; j++) {int num, cost;cin >> num >> cost;addEdge (num, i, cost);}}//枚举每一个等级作为最小等级,在可交换的等级区间内求最短路   int ans = INF;for (int i = 1; i <= N; i++) {//去除不可交换的等级区间内的物品for (int j = 1; j <= N; ++j) outlevel[j] = false;int min_level = level[i]; for (int j = 1; j <= N; j++) {if (level[j] < min_level || min_level + M < level[j] ) outlevel[j] = true; //第j个物品不可用于交换
        }dijkstra(0);ans = min(ans, dis[1].cost); }cout << ans << endl;return 0;
}

View Code

  

转载于:https://www.cnblogs.com/Bw98blogs/p/8451428.html

POJ #1062 昂贵的聘礼 有限制的最短路 枚举+dijkstra求最短路相关推荐

  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.昂贵的聘礼

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

  6. POJ - 1062 昂贵的聘礼

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

  7. POJ 1062 昂贵的聘礼

    一.内容 某天超市搞活动,小明想买一个自己一直想买的电脑,平时需要7000,小明觉得太贵了.但活动当天,超市里的商品可以通过买其他商品获得优惠券.例如买一个键盘然后买电脑只需要5000,如果买一个鼠标 ...

  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. 评分9.7!这本Python书彻底玩大了?程序员:真香!
  2. hexo博客系统安装
  3. python精通-11周精通python计划(完结)-网易云课堂
  4. python读取目录_Python读取一个目录下所有目录和文件
  5. mysql创建表的时候显式申明字符集
  6. Vmware提示:host usb device connections disabled-(vmware 主机已禁用 usb 设备连接)
  7. C语言模拟实现标准库函数之strcmp()
  8. 【Java】如何较好地将int转化成String
  9. 转:LruCache算法
  10. 基于Mesos和Docker的分布式计算平台
  11. 前端工具以及其他一些东西
  12. 拿下 ACM 金牌!
  13. 微信小程序在苹果上出现[request:fail 发生了 SSL 错误无法建立与该服务器的安全连接。]错误的解决方案
  14. vue组件内容不显示
  15. 持续集成 -- Jenkins + Slack 配置
  16. shell softech 面料_户外软壳面料及各品牌的技术
  17. ELK7.1.1之插件安装
  18. 阿里云数加案例-美柚
  19. android o 结构光流程,结构光光条中心的提取算法.pdf
  20. idea快捷键(mac和Windows对比)

热门文章

  1. .unsqueeze(0)
  2. 团战可以输、提莫必须死 Time Limit: 1000 ms Memory Limit: 65536 KiB
  3. 一个专注极简的导航主页
  4. 如何有效地提高工作效率
  5. 2个月7登顶刊!郭光灿团队实现硅自旋量子比特的国际最快调控
  6. Word中千分号怎么打?
  7. 《JAVA编程思想》学习笔记:第21章(并发)
  8. zipimport.ZipImportError: can‘t decompress data; zlib not available 解决
  9. unity学习笔记-特效篇
  10. 问题生成(QG)与答案生成(QA)