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

分析

  输出最小的金币数,这道题首先想到的就是建图跑最小路,我最开始用的方法是根据所给信息把边权和点权都加上,然后在跑Dij的时候判断

如果选择边权,那么还要加和这个点的儿子的权,如果选择点权就不用,然后统计到各个点最小距离。

  打了一下样例没过,然后回去想,发现加的是双向边,于是又加了一个vis数组判断是否访问过,这次样例过了,交上去WA

  再仔细想一下,先不管我的点权和边权处理有没有问题,就一个问题是很难解决的,就是终点是什么,不一定所有的点都能当做本次统计的终点

也就是说它会直接返回最小值,不管这个最小值是不是已经把所有需要的点权边权都包括进去了,比如我要买二号物品来降低一号物品价格,在统计

到二号物品的路程时,直接返回了边权,但点权也是应该加上的,所以没有选完全     我感觉还是我的程序有问题 

  重新思考,有没有一种方法能够让程序自动判断选择边权还是点权,并且终点是一样的?

  受如果使用该物品的话边权和点权必选其一的启发,我们可以采用超级源点,即把所有的点的点权作为这个点和超级源点的边权,于是又跑一遍

又没过样例,这次我发现一个问题,我加的是双向边,而加双向边是肯定不行的,因为边权表示买二号物品得到三号物品的优惠,如果加双向的话就

表明买三号物品也能得到二号物品的优惠,这显然是不对的,于是我们考虑边的方向,从源点出来,边的去向一定是指向每个点,因为我们是以源点

为起点,一号物品为终点跑的Dij,所以输入时,如果买a对b有优惠,那么Add_Edge(a->b),这样就可以保证终点是一样的,且最短路径上每个点的

点权或边权都被选完全了。

  修改完代码,测了测样例,对了!然后交上去,WA。。。。

  接着我思考半天后找到了我最开始过深考虑的问题——等级,我起初是怎么处理的呢?我在建图时判断,如果一个点的等级与第一物品的差值的

绝对值小于m,就不加这个点及其周围的边。这么看好像是对的,举个例子,m=3,level[1]=8,我们买了level[2]=6,level[3]=10的两个物品,由题意,

这不被允许,所以不能这么判断,但这给了我一个启发:买的物品价值范围(levelmax-levelmin<=m),所以我们可以考虑枚举物品的价值范围,每次

对于枚举的范围进行Dij求最短路,输出最短的路径即可。

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=,INF=0x3f3f3f3f;
struct Edge{
int to,next,val;
}e[N*N];
struct Node{
int id,val;
Node(){};
Node(int a,int b){id=a;val=b;}
bool operator < (const Node&A)const {
return val>A.val;
}
};
int Head[N],len,lev[N],ans,m,n,dis[N];
void Ins(int a,int b,int c){
e[++len].to=b;e[len].val=c;
e[len].next=Head[a];Head[a]=len;
}
void dij(int level){
priority_queue<Node> q;
memset(dis,0x3f,sizeof(dis));
dis[]=;
q.push(Node(,dis[]));
while(!q.empty()){
Node u=q.top();q.pop();
for(int x=Head[u.id];x;x=e[x].next){
int v=e[x].to;
if(lev[v]-level>m||lev[v]<level)continue;
if(dis[v]>dis[u.id]+e[x].val){
dis[v]=dis[u.id]+e[x].val;
q.push(Node(v,dis[v]));
}
}
}
ans=min(ans,dis[]);
}
int main(){
// freopen("a.txt","r",stdin);
int selfval;
ans=INF;
scanf("%d%d",&m,&n);
for(int i=;i<=n;i++){
int c;
scanf("%d%d%d",&selfval,&lev[i],&c);
Ins(,i,selfval);
for(int j=;j<=c;j++){
int a,b;
scanf("%d%d",&a,&b);
Ins(a,i,b);
}
}
for(int i=lev[]-m;i<=lev[];i++)
dij(i);
printf("%d\n",ans);
}

Code

这个问题看起来还是比较难的,但是想明白以后也比较简单,下次在做题的时候一定把问题先想清楚,边做边想太难了。。。。。。

POJ 1062 昂贵的聘礼 最短路+超级源点的更多相关文章

  1. POJ - 1062 昂贵的聘礼(最短路Dijkstra)

    昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u SubmitStatus Descr ...

  2. POJ 1062 昂贵的聘礼 最短路 难度:0

    http://poj.org/problem?id=1062 #include <iostream> #include <cstring> #include <queue ...

  3. poj 1062 昂贵的聘礼 最短路 dijkstra

    #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #incl ...

  4. 最短路(Dijkstra) POJ 1062 昂贵的聘礼

    题目传送门 /* 最短路:Dijkstra算法,首先依照等级差距枚举“删除”某些点,即used,然后分别从该点出发生成最短路 更新每个点的最短路的最小值 注意:国王的等级不一定是最高的:) */ #i ...

  5. POJ 1062 昂贵的聘礼(图论,最短路径)

    POJ 1062 昂贵的聘礼(图论,最短路径) Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女 ...

  6. poj 1062 昂贵的聘礼 (dijkstra最短路)

    题目链接:http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submission ...

  7. 最短路POJ 1062 昂贵的聘礼

    C - 昂贵的聘礼 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit St ...

  8. POJ 1062 昂贵的聘礼 (最短路)

    昂贵的聘礼 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/M Description 年轻的探险家来到了一个印第安部落里.在那里 ...

  9. POJ 1062 昂贵的聘礼 【带限制的最短路/建模】

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

随机推荐

  1. VMWare vCenter 4.x 数据库由SQL Express 迁移至SQL Server 2008 R2

    默认安装下的 VMware vCenter 4.x 会在本地安装 SQL Express 2005 版本,如果你有需要迁移至 Full SQL Server版本比如 SQL Server 2008 R ...

  2. 从未来看 C#

    前言 如今 C# 虽然发展到了 8.0 版本,引入了诸多的函数式特性,但其实在 C# 未来的规划当中,还有很多足以大规模影响现有 C# 代码结构和组成的特性,本文中将会对就重要的特性进行介绍,并用代码 ...

  3. git指令-工作区和暂存区

    #git指令-工作区和暂存区 工作区(Working Directory):就是平常电脑可以看到的文件夹目录 版本库(Repository):存放git内容的文件夹例如: Git的版本库里存了很多东西 ...

  4. 丰富图文详解B-树原理,从此面试再也不慌

    本文始发于个人公众号:TechFlow,原创不易,求个关注 本篇原计划在上周五发布,由于太过硬核所以才拖到了这周五.我相信大家应该能从标题当中体会到这个硬核. 周五的专题是大数据和分布式,我最初的打算 ...

  5. ArrayBuffer转base64详解

    先贴代码: const base64String = window.btoa(String.fromCharCode(... new Uint8Array(buffer))) 看起来非常的简洁,优美. ...

  6. echarts实现饼图及横向柱状图的绘制

    项目中需要绘制饼图,因此简单学习了下echarts的基本使用.head中引入js文件: <script src="/static/frame/echarts/echarts.min.j ...

  7. git add的各种情况分类

    ·  git add -A  提交所有变化 ·  git add -u  提交被修改(modified)和被删除(deleted)文件,不包括新文件(new) ·  git add .  提交新文件( ...

  8. XCTF---easyjni的WriteUp

    一.题目来源     题目来源:XCTF的mobile区的easyjni题目.     题目下载地址:题目链接地址 二.解题过程     1.下载好题目后,安装到夜神模拟器中,发现有一个输入框和一个按 ...

  9. scrapy 在爬取过程中抓取下载图片

    先说前提,我不推荐在sarapy爬取过程中使用scrapy自带的 ImagesPipeline 进行下载,是在是太耗时间了 最好是保存,在使用其他方法下载 我这个是在 https://blog.csd ...

  10. 项目测试中发现产品bug怎么办

    我所在的产品线,并非公司最大最强的产品 甚至为了推广我们这个产品,一般会拿给客户先免费试用 而在试用之前,是要经过一番通测的,测得很急,测得很快 所以产品bug非常多 那么在测试项目的时候,自然会发现 ...