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

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

中文题面,比较好理解,就不说明了
由于最终要换到1号物品,第一反应是逆向求1号物品换到其它物品的花费,再转换成换到1号物品的花费,但是由于交换物品时的等级限制,这样处理会很麻烦
于是想到,假设一个0号物品,求由0号物品换到1号物品的花费
关于等级限制,无法确定酋长是否是最高等级,于是可以将0号物品依次设为n个物品的等级,并假设0号物品为最低等级,进行n次最短路操作,则可以得到所有交换情况
 #include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<cstdio>
#include<queue>
#include<stack> using namespace std; const int INF = 0x3f3f3f3f;
int m, n;
int val[], rank[], cost[][], dis[];
bool vis[]; bool crank( int i ){
if( rank[i] >= rank[] && rank[i] - rank[] <= m ) return true;
return false;
} int dijkstra(){
memset( vis, false, sizeof( vis ) );
memset( dis, INF, sizeof( dis ) );
for( int i = ; i <= n; i++ ){
dis[i] = val[i];
} for( int t = ; t <= n; t++ ){
int mini, minx = INF;
for( int i = ; i <= n; i++ ){
if( !vis[i] && dis[i] < minx ){
mini = i;
minx = dis[i];
}
} vis[mini] = true;
if( !crank( mini ) ) continue; for( int i = ; i <= n; i++ ){
if( !vis[i] && crank( i ) && dis[i] > dis[mini] + cost[mini][i] )
dis[i] = dis[mini] + cost[mini][i];
}
} return dis[];
} int main(){
ios::sync_with_stdio( false ); cin >> m >> n;
int k, e, d;
memset( cost, INF, sizeof( cost ) );
for( int i = ; i <= n; i++ ){
cost[i][i] = ;
cin >> val[i] >> rank[i] >> k;
while( k-- ){
cin >> e >> d;
cost[e][i] = d;
}
} int ans = INF;
for( int i = ; i <= n; i++ ){
rank[] = rank[i];
ans = min( ans, dijkstra() );
} cout << ans << endl; return ;
}
												

最新文章

  1. python3: error while loading shared libraries: libpython3.5m.so.1.0: cannot open shared object file: No such file or directory
  2. Hibernate入门笔记
  3. MongoDB安装及shell简介
  4. Javascript中call的使用
  5. CI加载流程小结
  6. Windows Phone 使用 WriteableBitmap后台生成图片
  7. Unity大中华区主办 第二届Unity 游戏及应用大赛 实力派精品手游盘点
  8. FireBug 调试工具(推荐)
  9. robotframework自动化系列:删除操作流程以及总结
  10. 使用canvas实现绚丽的时钟特效
  11. BZOJ 3585: mex [主席树]
  12. EE4218 / EE4216 Faculty of Science and Engineering
  13. IndexDB 操作util
  14. mybatis中设置打印sql语句application.yml
  15. 我的Java之旅 第六课 JAVA WEB 请求与响应
  16. Educational Codeforces Round 26 B,C
  17. javascript 编辑网页
  18. 在linux中,如何增加、修改、删除、暂停和冻结用户名
  19. oracle排序使用,很多中函数,不同的效果
  20. Spring 一二事(8) - annotation 形式的 MVC

热门文章

  1. python 感悟
  2. Drools规则引擎-如果判断某个对象中的集合是否包含指定的值
  3. 并发栅栏CyclicBarrier---简单问2
  4. poj 2524 Ubiquitous Religions(简单并查集)
  5. PID算法通俗理解,平衡车,倒立摆,适合不理解PID算法的人来看!
  6. 【Python】Django【邮箱验证】 后端验证如何生成 token加密验证码 与如何解码!!!!
  7. 算法与数据结构基础 - 链表(Linked List)
  8. Leetcode solution 227: Basic Calculator II
  9. jq css3实现跑马灯+大转盘
  10. 洛谷 P3203 [HNOI2010]弹飞绵羊