博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1062昂贵的聘礼[最短路建模]
阅读量:5736 次
发布时间:2019-06-18

本文共 2396 字,大约阅读时间需要 7 分钟。

昂贵的聘礼
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 45892   Accepted: 13614

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 410000 3 22 80003 50001000 2 14 2003000 2 14 20050 2 0

Sample Output

5250

Source


orz hzwer
大致想出来了,没想到要枚举最低等级
超级源0,0到任何物品的距离为p,如果a是b的替代品,则a到b的距离是优惠价格;枚举L求min{d[1]}
注意是到达,不是从开始
////  main.cpp//  poj1062////  Created by Candy on 9/13/16.//  Copyright © 2016 Candy. All rights reserved.//#include 
#include
#include
#include
#include
using namespace std;const int N=105,INF=1e9;inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){
if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x;}int m,n,l[N],sl[N],p,t,x,val,ans=INF;struct edge{ int v,w,ne;}e[N*N];int h[N],cnt=0;inline void ins(int u,int v,int w){ cnt++; e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;}int d[N],inq[N],q[N*N],head=1,tail=0;void spfa(int mn){ for(int i=1;i<=n;i++) d[i]=INF; d[0]=0; inq[0]=1; q[++tail]=0; while(head<=tail){ int u=q[head++];inq[u]=0; for(int i=h[u];i;i=e[i].ne){ int v=e[i].v,w=e[i].w; if(mn+m
d[u]+w){ d[v]=d[u]+w; if(!inq[v]){inq[v]=1;q[++tail]=v;} } } } ans=min(ans,d[1]);}int main(int argc, const char * argv[]) { m=read();n=read(); for(int i=1;i<=n;i++){ p=read();l[i]=sl[i]=read();x=read(); ins(0,i,p); while(x--){t=read();val=read();ins(t,i,val);} } sort(sl+1,sl+1+n); for(int i=1;i<=n;i++) if(sl[i]<=l[1]) spfa(sl[i]); printf("%d",ans); return 0;}

 

 

转载地址:http://nxgwx.baihongyu.com/

你可能感兴趣的文章
Best website for Photogrammetry
查看>>
中文词频统计
查看>>
POJ 2236 Wireless Network (并查集)
查看>>
python分类
查看>>
linux 中常见的压缩和解压缩的命令
查看>>
GitBlit (1)-- 在linux 安装 GitBlit 并运行
查看>>
Windows与Linux之间的文件自动同步
查看>>
topcoder srm 714 div1
查看>>
20160215
查看>>
mxnet导入图像数据
查看>>
程序是如何执行的(一)a=a+1
查看>>
go : 结构
查看>>
【Python第五篇】Python面向对象(初级篇)
查看>>
innobackupex参数之 --throttle 限速这个值设置多少合理 原创
查看>>
18 已知下面的字符串是通过RANDOM随机数变量md5sum|cut-c 1-8截取后的结果
查看>>
BZOJ - 3578: GTY的人类基因组计划2
查看>>
理解WebKit和Chromium(电子书)
查看>>
爱——无题
查看>>
分布式服务框架原来与实践 读书笔记一
查看>>
Aho-Corasick automation-KMP
查看>>