题解【POJ1062】昂贵的聘礼
比较复杂的最短路模型转换。
我们考虑一种建图方式:
- 建立一个超级源点 \(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】昂贵的聘礼的更多相关文章
- POJ-1062 昂贵的聘礼 (最短路)
POJ-1062 昂贵的聘礼:http://poj.org/problem?id=1062 题意: 有一个人要到1号点花费最少的钱,他可以花费一号点对应的价格,也可以先买下其他一些点,使得费用降低. ...
- POJ1062昂贵的聘礼[最短路建模]
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45892 Accepted: 13614 Descripti ...
- [poj1062]昂贵的聘礼_最短路_离散化
昂贵的聘礼 poj-1062 题目大意:原文链接?不是英文题,自己看 注释:$1\le N \le 100$. 想法:开始的想法有些过于简单,因为落下了一个条件:就是等级限制是一条路径上的任意两点而不 ...
- POJ1062昂贵的聘礼(dijkstra)
昂贵的聘礼 题目大意是说有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个)替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1 由于有N个物 ...
- POJ1062 昂贵的聘礼 【DFS】
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37475 Accepted: 10816 Descripti ...
- POJ1062昂贵的聘礼(经典) 枚举区间 +【Dijkstra】
<题目链接> 昂贵的聘礼 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用1000 ...
- POJ1062 昂贵的聘礼(带限制的spfa)
Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...
- Poj1062 昂贵的聘礼 (dijkstra算法)
一.Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长 ...
- poj1062 昂贵的聘礼
Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...
- POJ-1062 昂贵的聘礼---Dijkstra+枚举上界
题目链接: https://vjudge.net/problem/POJ-1062 题目大意: 中文题 思路: 1是终点,可以额外添加一个源点0,0到任意一节点的距离就是这个点的money,最终求的是 ...
随机推荐
- CNN卷积神经网络入门整合(科普向)
这是一篇关于CNN入门知识的博客,基本手法是抄.删.改.查,就算是自己的一个笔记吧,以后忘了多看看. 1.边界检测示例假如你有一张如下的图像,你想让计算机搞清楚图像上有什么物体,你可以做的事情是检 ...
- 写ppt的助手
代码格式化工具. https://carbon.now.sh/?bg=rgba(74%2C144%2C226%2C1)&t=material&wt=none&l=auto&am ...
- -bash: warning: setlocale: LC_CTYPE: cannot change locale (zh_CN.UTF-8mb4): No such file or directory
前几天登录服务器发现出现了这些个警告,一直没时间去处理他,今天难得有空,处理一下并记录下来,希望可以帮助到有需要的朋友. 警告信息如下: Last login: Tue May :: from 192 ...
- 【GET TIPS】Chrome所见即所得的截图技巧
精简的前言: 对,我就是想说下事情的来龙去脉.您要不想听,就把耳朵捂起来23333. 想截个新冠肺炎病毒,全国确诊人数今日增长的图,以确定非湖北地区不再明显增长. 但由于网页需要的内容分布在两页,需要 ...
- Android项目实战(五十九):调试方法神器Hugo
先上GitHub地址:Hugo 一句话描述该框架,以Log的形式告诉我们某个方法传入的每一个参数以及返回值,以及调用的activity 时间 等其他信息 非常适用方便代码调试 引入框架: 根目录下的b ...
- Git操作:查看所有分支的提交修改
我们在廖雪峰Git教程或者一些书籍学习git分支时,大都会学习到这样一个命令git log --graph或者就是单纯的git log,他可以用来查看当前分支.但是这个弊端就是:它只能查看与当前分支有 ...
- TCP/IP详解阅读记录----第一章 概述
1.TCP/IP协议族中不同层次的协议 2.五类互联网地址 3.各类IP地址范围 4.数据进入协议栈时的封装过程 5.以太网数据帧的分用过程
- JS数据类型和堆栈+变量比较和值的复制+参数传递和类型检测
变量命名 变量名:字母 数字 下划线 美元符$ jquery: $ $.each() $ === jQuery underscore( js的一个函数库) : _ _.ea ...
- svn cleanup 失败问题解决
将sqlite3.exe放到.svn的同级目录 4.启动cmd执行sqlite3 .svn/wc.db "select * from work_queue" 5.启动cmd执行sq ...
- linux环境安装mysql
安装虚拟机: RedHat+CentOS 我说略会不会被打,哈哈,这个虚拟机的安装之后我再补上吧~~ 首先查看已经安装的mysql相关的包 rpm -qa | grep mysql 执行之后会出现以 ...