题面

比较复杂的最短路模型转换。

我们考虑一种建图方式:

  • 建立一个超级源点 \(S\),它向每一个节点连一条权值为那一个节点物品价值的边,表示直接购买那一个物品;
  • 对于每一个节点,由它每一个可用的替代品向它连一条权值为当前替代品“优惠价格”的边,表示使用那一个替代品来购买当前物品。
  • 最终答案即为 \(S\) 到 \(1\) 号节点的最短距离。

考虑等级限制,我们可以枚举当前最低的等级,然后在进行松弛操作的时候判断一下当前节点是否在当前等级限制之内。每一次跑完最短路后将答案与当前的 \(dist_1\) 取 \(\text{min}\)。

注意从 \(0\) 开始枚举最低等级。

#include <iostream>
#include <cstring>
#include <queue> using namespace std; const int N = 103, M = 20003; int n, m;
int grade[N]; //每个物品的等级
int tot, head[N], ver[M], nxt[M], edge[M];
int dist[N], vis[N];
int S; inline void add(int u, int v, int w)
{
ver[++tot] = v, edge[tot] = w, nxt[tot] = head[u], head[u] = tot;
} inline void Dij(int s/*起点*/, int t/*终点*/, int LowGrade/*当前的最低等级*/, int HighGrade/*当前的最高等级*/)
{
memset(dist, 0x3f, sizeof dist);
priority_queue <pair <int, int> > q;
dist[S] = 0;
memset(vis, 0, sizeof vis);
q.push(make_pair(0, S));
while (!q.empty())
{
int u = q.top().second; q.pop();
vis[u] = 0;
for (int i = head[u]; i; i = nxt[i])
{
int v = ver[i], w = edge[i];
if (grade[v] < LowGrade || grade[v] > HighGrade) continue; //不满足当前的等级限制
if (dist[v] > dist[u] + w)
{
dist[v] = dist[u] + w;
if (!vis[v])
vis[v] = 1,
q.push(make_pair(-dist[v], v));
}
}
}
} int main()
{
cin >> m >> n;
S = n + 1; //超级源点
for (int i = 1; i <= n; i+=1)
{
int u = i, v, w, x;
cin >> w >> grade[i] >> x;
add(S, u, w); //向超级源点连一条权值为物品价格的边
for (int j = 1; j <= x; j+=1)
cin >> v >> w,
add(v, u, w); //由替代品向当前物品连边
}
int ans = 2000000007;
for (int nowLowGrade = 0; nowLowGrade <= n; nowLowGrade+=1) //枚举最低等级,注意要从 0 开始
{
Dij(S, 1, nowLowGrade, nowLowGrade + m); //跑一次 Dijkstra 最短路
ans = min(ans, dist[1]); //将答案取最小值
}
cout << ans << endl;
return 0;
}

题解【POJ1062】昂贵的聘礼的更多相关文章

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

    POJ-1062 昂贵的聘礼:http://poj.org/problem?id=1062 题意: 有一个人要到1号点花费最少的钱,他可以花费一号点对应的价格,也可以先买下其他一些点,使得费用降低. ...

  2. POJ1062昂贵的聘礼[最短路建模]

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

  3. [poj1062]昂贵的聘礼_最短路_离散化

    昂贵的聘礼 poj-1062 题目大意:原文链接?不是英文题,自己看 注释:$1\le N \le 100$. 想法:开始的想法有些过于简单,因为落下了一个条件:就是等级限制是一条路径上的任意两点而不 ...

  4. POJ1062昂贵的聘礼(dijkstra)

    昂贵的聘礼 题目大意是说有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个)替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1 由于有N个物 ...

  5. POJ1062 昂贵的聘礼 【DFS】

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37475   Accepted: 10816 Descripti ...

  6. POJ1062昂贵的聘礼(经典) 枚举区间 +【Dijkstra】

    <题目链接>                   昂贵的聘礼 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用1000 ...

  7. POJ1062 昂贵的聘礼(带限制的spfa)

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

  8. Poj1062 昂贵的聘礼 (dijkstra算法)

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

  9. poj1062 昂贵的聘礼

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

  10. POJ-1062 昂贵的聘礼---Dijkstra+枚举上界

    题目链接: https://vjudge.net/problem/POJ-1062 题目大意: 中文题 思路: 1是终点,可以额外添加一个源点0,0到任意一节点的距离就是这个点的money,最终求的是 ...

随机推荐

  1. webpack构建vue单文件组件

    1.安装vue-loader和vue-template-compiler npm i vue-loader vue-template-compiler --save-dev 2.配置webpack.c ...

  2. 从零开始学习MySQL全文索引

    目录 一.为什么要用全文索引 二.什么是全文索引 三.如何创建全文索引 四.创建测试数据 五.查询-使用自然语言模式 六.查询-使用布尔模式(强大的语法) 语法 示例 七.查询-使用扩展模式 八.注意 ...

  3. linux中find文件搜索命令

    find 解释 命令名称:find 命令所在路径:/bin/find 执行权限:所有用户 功能描述:文件搜索 语法 find [搜索范围] [匹配条件] 匹配条件: -name 文件名(区分大小写) ...

  4. StackExchange.Redis 之 List队列 类型示例

    //从第1个开始,依次向左插入值.如果键不存在,先创建再插入值 队列形式 先进后出,后进先出 //插入后形式  <-- 10,9,8,7,6,5,4,3,2,1 <-- 方向向左依次进行 ...

  5. 常见CSS3选择器和文本字体样式汇总

    常见的CSS3选择器包含:常用基本.属性.伪类.层级(组合)选择器,具体使用情况建议先阅读css选择器四大类:基本.组合.属性.伪类对于选择器的使用有一个基本了解,选择器的作用在于通过它找到元素,并且 ...

  6. 全国省市,4个直辖市geoCoord数据,用于echart gl 3d地图

    var geoCoordMap = { '北京': [116.4551, 40.2539], '东城区':[116.418757,39.917544], '西城区':[116.366794,39.91 ...

  7. 微信小程序入门笔记-账号注册(1)

    小程序注册 微信小程序开发之前,必须先有小程序账号,下面是注册步骤: 1.打开网页 微信公众平台https://mp.weixin.qq.com/,点击立即注册按钮 2.注册类型 选择小程序开发 3. ...

  8. 「Flink」RocksDB介绍以及Flink对RocksDB的支持

    RocksDB介绍 RocksDB简介 RocksDB是基于C++语言编写的嵌入式KV存储引擎,它不是一个分布式的DB,而是一个高效.高性能.单点的数据库引擎.它是由Facebook基于Google开 ...

  9. eclipse中一个项目引用另一个项目的方法

    我们在开发的时候,有时候需要把一个大的项目打散,尤其是现在微服务的架构很流行,一个大的项目往往被拆成很多小的项目,而有的项目作为公共工程被独立出来,比如有个工程专门提供各种Util工具类,有的工程专门 ...

  10. 深入浅出 .NET C# 反射技术

    反射这个词听起来就很牛逼是吧? 嗯的确,反射是比较高级的特性,只有语言基础很扎实的Dev们才应该使用它. 搞点反射,可以提高程序的灵活性.可扩展性.耦合度. 反射这东西,是为了动态地运行时加载,相比于 ...