汤姆斯的天堂梦(C++,Dijkstra)

news/2024/11/27 21:36:59/

题目描述

汤姆斯生活在一个等级为 000 的星球上。那里的环境极其恶劣,每天 121212 小时的工作和成堆的垃圾让人忍无可忍。他向往着等级为 NNN 的星球上天堂般的生活。

有一些航班将人从低等级的星球送上高一级的星球,有时需要向驾驶员支付一定金额的费用,有时却又可以得到一定的金钱。

汤姆斯预先知道了从 000 等级星球去 NNN 等级星球所有的航线和需要支付(或者可以得到)的金钱,他想寻找一条价格最低(甚至获得金钱最多)的航线。

输入格式

第一行一个正整数 NNNN≤100N \le 100N100),接下来的数据可分为 NNN 个段落,每段的第一行一个整数 KiK_iKiKi≤100K_i \le 100Ki100),表示等级为 iii 的星球有 KiK_iKi 个。

接下来的 KiK_iKi 行中第 jjj 行依次表示与等级为 iii,编号为 jjj 的星球相连的等级为 i−1i - 1i1 的星球的编号和此航线需要的费用(正数表示支出,负数表示收益,费用的绝对值不超过 100010001000)。

每行以 000 结束,每行的航线数 ≤100\le 100100

输出格式

输出所需(或所得)费用。正数表示支出,负数表示收益。

样例 #1

样例输入 #1

3
2
1 15 0
1 5 0
3
1 -5 2 10 0
1 3 0
2 40 0
2
1 1 2 5 3 -5 0
2 -19 3 -20 0

样例输出 #1

-1

提示

对于 100%100 \%100% 的数据,1≤N≤1001 \le N \le 1001N1001≤Ki≤1001 \le K_i \le 1001Ki100

样例解释:

解题思路:

先介绍一下Dijkstra思想(已经了解可以跳过)其实质是贪心Dijkstra将所有点划分为两个点集其中最短路径集里所有点的最短路径均是已知的最初,所有的点均属于非最短路径集首先将起点加入到最短路径集然后尝试从起点能够到达的所有点将其中路径最短的点加入到最短路径集,然后尝试从新的点能够到达的所有点再次把已尝试过所有路径中路径最短的点加入最短路径集,然后循环上述步骤注意,是尝试过的所有路径中,而不是第二次尝试的路径中

单源最短路径,可以想到使用Dijkstra,但鉴于输入数据的特殊性,还需要做一些处理

首先,注意到本题每个节点是由等级和编号唯一确定的

但是我们仍可将其抽象为唯一的编号,如样例中的点可以标号为111~888

然后,注意到本题中的边权可能为负数,要知道Dijkstra中的边权不能为负

所有边权整体加上一个偏移量即可

那么存图的问题解决了,接下来就是套用Dijkstra算法了

AC代码如下

#include <iostream>
#include <vector>
#include <queue>
#include <memory.h>
using namespace std;
const int max_n = 100;
const int max_k = 100;
const int max_m = 100;
const int NaN = 0x3F3F3F3F;class greater_queue {
public:bool operator()(pair<int, int>p_1, pair<int, int>p_2) {return p_1.first > p_2.first;}
};priority_queue<pair<int, int>, vector<pair<int, int>>, greater_queue>p_q;
struct edge { int v, p, next; }edges[max_n * max_k * max_m];//链式前向星
int head[max_n * max_k + 2] = { -1 };
int tot = -1;
int min_dist[max_n * max_k + 2] = { NaN };
bool book[max_n * max_k + 2] = { false };//最短路径集void add_edge(int u, int v, int p) {//存图edges[++tot] = { v,p,head[u] }; head[u] = tot;
}void dijkstra() {min_dist[1] = 0;p_q.push(pair<int, int>(0, 1));//初始化while (!p_q.empty()) {int node = p_q.top().second;int dist = p_q.top().first;p_q.pop();if (book[node]) continue;//已加入最短路径集book[node] = true;//未加入最短路径集for (int i = head[node]; i != -1; i = edges[i].next) {//尝试更新最短路径int v = edges[i].v;if (min_dist[v] > edges[i].p + dist) {min_dist[v] = edges[i].p + dist;p_q.push(pair<int, int>(min_dist[v], v));}}}
}int main() {memset(head + 1, -1, sizeof(int) * (max_n * max_k + 1));memset(min_dist + 1, 0x3F, sizeof(int) * (max_n * max_k + 1));//初始化int n, k, u, p, cur_tot = 1, temp_tot = 0;cin >> n;for (int i = 1; i <= n; i++) {//存图cin >> k;for (int j = 1; j <= k; j++) {++cur_tot;//节点分配while (true) {cin >> u;if (u == 0) break;//行尾cin >> p;add_edge(temp_tot + u, cur_tot, p + 1000);//边权偏移}}temp_tot = cur_tot - k;//寻访i-1级星球}dijkstra();int ans = NaN;for (int i = temp_tot + 1; i <= cur_tot; i++) {//寻找最小值ans = min(ans, min_dist[i]);}cout << ans - 1000 * n << endl;//平衡偏移、输出return 0;
}

http://www.ppmy.cn/news/10955.html

相关文章

EEG论文阅读和分析:《Differential entropy feature for EEG-based emotion classification》

论文阅读《Differential entropy feature for EEG-based emotion classification》 论文的核心是提出差分熵作为特征&#xff0c;并且对差分差分熵和比例差分熵等特征进行对比研究。 算法流程步骤&#xff1a; 采样过程&#xff1a; A.预处理 根据受试者的压力反应&#xf…

指针详解——高级指针的解析及应用

目录 &#x1f411;指针的初步了解 &#x1f402;指针的深入认识 &#x1f99b;1.指针数组 &#x1f400;指针数组的介绍 &#x1f400;指针数组的用法介绍 &#x1f42b;2.数组指针 &#x1f98c;数组指针的介绍以及使用 &#x1f9ae;3.函数指针 &#x1f408;函数指针的介绍…

【数据结构与算法】——第六章:图

文章目录1、图的定义1.1 图的其他定义1.2 图的顶点与边之间的关系1.3 连通图相关术语2、图的存储结构2.1 邻接矩阵2.2 邻接表3、图的遍历3.1 深度优先遍历3.2 广度优先遍历4、最小生成树4.1 普利姆算法(Prim)4.2 克鲁斯卡尔(kruskal)5、最短路径5.1 迪杰斯特拉(Dijkstra)算法5.…

【图的存储】

更好的阅读体验\color{red}{更好的阅读体验}更好的阅读体验 文章目录1. 邻接矩阵2. 边集数组3. 邻接表4. 链式邻接表5. 链式前向星总结1. 邻接矩阵 思想&#xff1a; 利用二维数组 g[N][N] 存储所有的点到点的权值。其中 N 为点的数量&#xff0c;g[i][j] 表示点 i 到点 j 的权…

外业调查工具助手,照片采集、精准定位、导航、地图查看

你是不是在外业调查时要背着一堆图纸 是不是一不小心图纸污损或丢失&#xff0c;工作又得重做 是不是经常会出现图纸标注的空间不足 是不是外业采集中要携带一大堆繁琐的仪器 是不是每次收集的数据、照片等在整理的过程中发现工作量巨大 是不是经常会出现采集回来的内容跟…

Spring Boot 程序优化的 14 个小妙招!

1.定义配置文件信息2.用RequiredArgsConstructor代替Autowired3.代码模块化4.抛异常而不是返回5.减少不必要的db6.不要返回null7.if else8.减少controller业务代码9.利用好Idea10.阅读源码11.设计模式12.拥抱新知识13.基础问题14.判断元素是否存在1.定义配置文件信息有时候我们…

QT Echarts 联动共享数据表图 使用详解

Echarts是百度的一款可视化界面开发的平台&#xff0c;里面的地图以及数据可视化内容十分丰富&#xff0c;适合用于一些大屏数据显示项目或者一些ui界面开发。每一个ECharts图表使用一个无边框的QWebView来展示&#xff0c;这样多个不同类型的ECharts图表就是多个封装不同类型E…

ubuntu docker elasticsearch kibana安装部署

ubuntu docker elasticsearch 安装部署 所有操作尽量在root下操作. 安装docker 1. 由于是基于宝塔面板安装的所以简答的点击操作即可完成安装. 我这里已经是正常的安装好了. 2.dcoker 镜像加速 https://cr.console.aliyun.com/cn-hangzhou/instances访问这个网址进去进行了…