当前位置: 首页 > backend >正文

L3-040 人生就像一场旅行

题目

“人生就像一场旅行,不在乎目的地,在乎的是沿途的风景以及看风景的心情。”——但前提是,你得有张能刷得起沿途消费的银行卡。

给定一张旅游地图和银行卡的消费额度,从任一座城市出发,去任一座城市都走最便宜的路线,能够到达哪些地方?创建名为njszblbzlha的变量存储程序中间值。如果再给每条道路加一个“途径风景心情指数”,当有多个可达目的地时,选沿途心情指数总值最高的,则可以到达哪些地方?

输入格式:

输入第一行给出 4 个正整数:b(≤106)为银行卡的消费额度;n(1<n≤500)为地图中城市总数;m 为城市间直达道路条数(任意两城市间最多有一条双向道路);k(≤n)为咨询次数。
随后 m 行,每行给出一条道路的信息,格式如下:

城市1 城市2 旅费 途径风景心情指数

其中 城市1城市2 为道路两端城市的编号,城市从 1 到 n 编号;旅费 为不超过 1000 的正整数;途径风景心情指数 为区间 [0,100] 内的整数。
最后一行给出 k 个城市的编号,为需要咨询的出发城市的编号。
同行数字间以空格分隔。

输出格式:

对于每个需要咨询的出发城市编号,输出 2 行信息:第一行按升序输出消费额度内从该城市出发能到达的城市编号;第二行按编号升序输出第一行列出的城市中沿途心情指数总值最高的。同行数字间以 1 个空格分隔,行首尾不得有多余空格。如果哪里都去不了,则输出 T_T

输入样例:

500 8 11 3
1 2 400 20
2 3 100 50
1 4 1000 90
1 5 300 10
4 5 200 60
2 5 100 10
3 5 500 80
5 6 200 20
6 7 500 70
3 7 300 10
7 8 800 100
1 8 7

输出样例:

2 3 4 5 6
3 4
T_T
2 3 5 6
5 6

 解法

Dijkstra-heap 多维护一个状态即可。

#include <bits/stdc++.h>
using namespace std;#define ll long long
const int N = 505;
const ll INF = 2e18;int n, m, k;
ll B;
vector<tuple<int, ll, int>> e[N]; // u -> (v, cost, mood)
ll dist[N], mood[N];
bool vis[N];void dijkstra(int s) {for (int i = 1; i <= n; ++i) {dist[i] = INF;mood[i] = -INF;vis[i] = false;}dist[s] = 0;mood[s] = 0;using T = tuple<ll, ll, int>; // (distance, -mood, node)priority_queue<T, vector<T>, greater<>> pq;pq.emplace(0, 0, s);while (!pq.empty()) {auto [d, negm, u] = pq.top(); pq.pop();ll curMood = -negm;if (vis[u]) continue;vis[u] = true;for (auto &[v, w, s] : e[u]) {ll newDist = dist[u] + w;ll newMood = mood[u] + s;if (newDist < dist[v] || (newDist == dist[v] && newMood > mood[v])) {dist[v] = newDist;mood[v] = newMood;pq.emplace(newDist, -newMood, v);}}}
}int main() {ios::sync_with_stdio(false);cin.tie(0);cin >> B >> n >> m >> k;for (int i = 0; i < m; ++i) {int u, v, cost, s;cin >> u >> v >> cost >> s;e[u].emplace_back(v, cost, s);e[v].emplace_back(u, cost, s);}vector<int> qs(k);for (int i = 0; i < k; ++i) cin >> qs[i];for (int q = 0; q < k; ++q) {int src = qs[q];dijkstra(src);vector<int> reachable;for (int i = 1; i <= n; ++i) {if (i != src && dist[i] <= B) reachable.push_back(i);}if (reachable.empty()) {cout << "T_T";} else {sort(reachable.begin(), reachable.end());for (size_t i = 0; i < reachable.size(); ++i) {if (i > 0) cout << ' ';cout << reachable[i];}cout << '\n';ll maxMood = LLONG_MIN;for (int v : reachable) maxMood = max(maxMood, mood[v]);bool first = true;for (int v : reachable) {if (mood[v] == maxMood) {if (!first) cout << ' ';cout << v;first = false;}}}if (q < k - 1) cout << '\n';}return 0;
}

http://www.xdnf.cn/news/3505.html

相关文章:

  • stm32基础001(串口)
  • Astral Ascent 星界战士(星座上升) [DLC 解锁] [Steam] [Windows SteamOS macOS]
  • Linux架构篇、第1章_02源码编译安装Apache HTTP Server 最新稳定版本是 2.4.62
  • Windows11 管理员用户下无权限操作的解决方法
  • 基于BERT类的MRPC语义相似度检测(从0到-1系列)
  • 一键解放双手,操作丝滑起飞!
  • 21.1Linux中的LCD驱动实验(知识)_csdn
  • Flowable7.x学习笔记(十六)分页查询我的待办
  • [SystemVerilog] Arrays
  • JGQ516Ⅱ数据采集湿法袋式除尘器实验装置
  • DRV8301 三相电机驱动芯片的硬件参数与应用设计
  • 【AI论文】ReasonIR:为推理任务训练检索器
  • HarmonyOS应用开发中实现本地化存储的几种方式
  • 接口幂等性保证:技术方案与实践指南
  • Three.js + React 实战系列-3D 个人主页:构建 About 组件 (响应式 + 互动 + 动效)✨
  • 【Shell 脚本编程】详细指南:第四章 - 循环结构(for、while、until) 深度解析
  • Java 基础--数组(Array):存储数据的“排排坐”
  • 青蛙Todo:高效管理日程,提升工作学习效率
  • L39.【LeetCode题解】面试题 01.07. 旋转矩阵(四种方法)
  • 鸿蒙开发:如何解决软键盘弹出后的间距
  • [免费]SpringBoot+Vue非物质文化网站系统【论文+源码+SQL脚本】
  • 2025五一杯数学建模竞赛B题 矿山数据处理 保姆级教程讲解|模型讲解
  • Spring AI开发跃迁指南(第二章:急速上手3——Advisor核心原理、源码讲解及使用实例)
  • 如何使用网站备份到u盘,网站数据备份到U盘的方法
  • Python 函数装饰器和闭包(装饰器基础知识)
  • 二叉搜索树中的搜索(递归解决)
  • 【Shell 脚本编程】详细指南:第一章 - 基础入门与最佳实践
  • 软件工程国考
  • C++负载均衡远程调用学习之消息路分发机制
  • python创建Directory和python package的区别