年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用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

思路:我看网上的写法是 酋长等级为Q ,则可行区间为 【Q-m,Q】 ...... 【Q,Q+m】,枚举每个区间,然后不在区间内的点就不加入最短路,跑m遍最短路
我用了另一种写法,总感觉有点搜索的意思,在优先队列中存入的结构体中记录当前路径所走过的最高等级和最低等级,超过m就放弃这路径,否则更新
 #include<cstdio>
#include<cstring>
#include<queue>
using namespace std; int m,n;
struct Node
{
int s;
int low,high;
int val;
Node(int s=,int low=,int high=,int val=):s(s),low(low),high(high),val(val){}
bool operator<(const Node x)const
{
return val > x.val;
}
}; struct N
{
int y;
int next;
int val;
}node[]; int cnt,head[],level[];
void add(int x,int y,int val)
{
node[++cnt].y=y;
node[cnt].val =val;
node[cnt].next=head[x];
head[x]=cnt;
} priority_queue<Node>que;
int dist[];
bool vis[];
void dijstra()
{
while(!que.empty())que.pop();
que.push(Node(,level[],level[],));
memset(dist,0x3f,sizeof(dist));
while(!que.empty())
{
Node tmp = que.top();
que.pop();
if(vis[tmp.s])continue;
vis[tmp.s]=;
dist[tmp.s] = tmp.val;
for(int i=head[tmp.s];i;i=node[i].next)
{
int to = node[i].y;
int low = min(tmp.low,level[to]);
int high = max(tmp.high,level[to]);
if(dist[to] > tmp.val + node[i].val && high - low <= m)
{
que.push(Node(to,low,high,tmp.val+node[i].val));
}
} }
} int main()
{
scanf("%d%d",&m,&n);
for(int i=;i<=n;i++)
{
int p,l,x;
scanf("%d%d%d",&p,&l,&x);
level[i] = l;
add(,i,p);
for(int j=;j<=x;j++)
{
int t,num;
scanf("%d%d",&t,&num);
add(t,i,num);
}
}
dijstra();
printf("%d\n",dist[]);
}

昂贵的聘礼 POJ - 1062(最短路)的更多相关文章

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

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

  2. 昂贵的聘礼 - poj 1062 (Dijkstra+枚举)

      Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39976   Accepted: 11596 Description 年 ...

  3. 昂贵的聘礼 POJ - 1062

    题目链接:https://vjudge.net/problem/POJ-1062 如图,我们可以把交换的情况,抽象为一个有向图, 先抛去等级限制,那么就是一个最短路,从①出发,到达其他点的最短路中 最 ...

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

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

  5. POJ 1062 昂贵的聘礼详解最短路变形

    POJ上难得一见的中文题…… 思路:建立一个以0为源点的地图,那么Map[0][n]的值代表 第n号物品的价值,Map[i][j]代表用 j  替代 i 后,物品j的价值.我们认为酋长的承诺为节点 ‘ ...

  6. 昂贵的聘礼,(最短路的应用),Poj(1063)

    题目链接:http://poj.org/problem?id=1062 很好的一道中文题. 思路: 把每种替换当做一条边,权重为交易优惠,就是求原点0到物品1的最短路. 这里有限制条件,每个节点还有等 ...

  7. 昂贵的聘礼---poj1062(最短路)

    题目链接:http://poj.org/problem?id=1062 题意很清楚: 可以虚拟一个起点0,由于存在等级关系,所以可以枚举等级,然后把各种关系建立边,然后计算0到1的距离即可,去最小值即 ...

  8. poj1062昂贵的聘礼(枚举+最短路)

    题意:就是一个点能够被另一个点取代,通过花费一定的金币,注意就是你和某个人交易了,如果这个人的等级和酋长的等级差的绝对值超过m,酋长就不会和你交易了: 思路:这里要注意到,我们最终的目的是找到一条最短 ...

  9. POJ 1062 最短路Dijstra

    汉语题... 题意正如你看到的酱... 看的解题报告.思路大概是把每个点看做最高等级.然后枚举所有当前可以访问的点.进行dijstra算法.找到此时到目标点最短路.枚举完之后找到最小的点就可以了. P ...

随机推荐

  1. 状态模式-State Pattern(Java实现)

    状态模式-State Pattern 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. State接口 ...

  2. python selenium 最简单示例

    使用 pip 安装  selenium 下载 chromedriver,添加在PATH中 # -*- coding: utf-8 -*- from selenium import webdriver ...

  3. Linux-Shell编程之判断文件类型

    前言 如需使用本博文源码或者撰写文章,请注明博文来源:https://www.cnblogs.com/johnnyzen/p/10534386.html,劳动所得,侵权必究. 题目 設計一個shell ...

  4. thinkphp在iis上不是出现500错误

    按照官方文档,部署好iis下面URL重定向文件后,出现500错误,不停地百度,不停地修改web.config文件,终也不成. 在虚拟空间调整了php版本,一下子就好了.原来的版本为5.4,调整为5.6 ...

  5. 第31月第15天 -fembed-bitcode

    1. 确保打包的时候使用的是fembed-bitcode, 而不是fembed-bitcode-maker fembed-bitcode-maker:只是简单的标记一下在archive出来的二进制中b ...

  6. go之路

    目录 go初识[第一篇]初识 go初识[第二篇]包.变量.函数

  7. css 实现加载中3个点跳动

    <style type="text/css">.loading:after { overflow: hidden; display: inline-block; ver ...

  8. Java基础11-List;Set;Map

    作业解析: remove(int index); //删除指定位置的元素 List list = new ArrayList(); list.add("s1"); list.add ...

  9. Spring Cloud 2-Bus 消息总线(九)

    Spring Cloud  Bus  1.服务端配置 pom.xml application.yml 2.客户端配置 pom.xml application.yml Controller.java 3 ...

  10. .NET Core----七牛云图片上传

    在引用官方的qiniu.core的nuget是总是发生错误,错误如下,所以就在网上找到了一种解决方案,并稍微改进了一番, 以下是引用图: 方法一: 第一步:引用nuge 第二步:新建项目新建控制器视图 ...