首页 > 其他分享 >「清新题精讲」UVA 1048 - Low Cost Air Travel

「清新题精讲」UVA 1048 - Low Cost Air Travel

时间:2024-06-19 14:55:34浏览次数:9  
标签:rt dist int 精讲 1048 Air heap fi se

UVA 1048 - Low Cost Air Travel

\(\mathsf{\color{Thistle}{Statement}}\)

给定 \(n\) 张机票和 \(q\) 次旅行,每张机票都给出飞机所经过的城市,每一次乘座飞机,必须从飞机的起始站开始,且中途不能乘坐其他飞机再回来乘坐该架飞机,但是可以提前离开飞机。

对于第 \(i\) 次旅行,输出一次经过给定城市所需的最小代价。

\(\mathsf{\color{Thistle}{Solution}}\)

如果计算相邻 \(2\) 个城市之间的最小花费并累计,显然是不对的,因为可能相邻 \(3\) 个城市在一条航程上。

故,考虑 \((i,j)\) 表示走过了前 \(i\) 个给定城市,当前位于 \(j\)。那么,以该二元组建图后,再跑最短路即可。对于 \((i,j)\) 这个点,枚举可能所在的航道,以及在该航道飞至第几个城市,对于所有可能连边建图即可。

举个例子:「样例 \(1\)」\((1,1)\rightarrow (2,3),(1,1)\rightarrow (2,4),(1,1)\rightarrow (1,2)\dots\)

这样,对于 \(1\) 条边,其实便等价于 \(1\) 次换乘,所以边权也是显而易见的,时间复杂度:\(O(qn^4l)\),其中 \(l\) 为查询路径的长度。

注意:输出方案的时候,末尾不能有多余的空格✨。

\(\mathsf{\color{Thistle}{Code}}\)

#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long

using namespace std;

typedef pair<int, int> PII;
typedef pair<int, PII> PIII;
typedef long long LL;

const int N = 25;

int n, q, l;
struct route {
	int w;
	std::vector<int> city;
}rt[N];
std::map<PII, vector<PIII>> g;
std::map<PII, int> st;
std::map<PII, pair<PII, PII>> dist;

void dijkstra(PII start) {
	priority_queue<PIII, vector<PIII>, greater<PIII>> heap;
	dist.clear(), st.clear(), heap.push({0, start}), dist[start] = {{0, 0}, start};
	while (heap.size()) {
		auto u = heap.top();
		heap.pop();

		if (st.count(u.se)) continue;
		st[u.se] = 1;

		for (auto v : g[u.se]) {
			heap.push({u.fi + rt[v.fi].w, v.se});
			if (!dist.count(v.se)) dist[v.se] = {{u.fi + rt[v.fi].w, v.fi}, u.se};
			else if (u.fi + rt[v.fi].w < dist[v.se].fi.fi) dist[v.se] = {{u.fi + rt[v.fi].w, v.fi}, u.se};
		}
	}
}

signed main() {
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	int cs = 0;
	while (cin >> n && n) {
		set<int> pnt;
		for (int i = 1; i <= n; i ++) {
			cin >> rt[i].w >> l, rt[i].city.resize(l + 1);
			for (int j = 1; j <= l; j ++)
				cin >> rt[i].city[j], pnt.insert(rt[i].city[j]);
		}

		cin >> q, cs ++;
		for (int trip = 1; trip <= q; trip ++) {
			cin >> l;
			std::vector<int> path(l + 1);
			for (int i = 1; i <= l; i ++)
				cin >> path[i];
			for (int i = 1; i < l; i ++)
				for (auto v : pnt) {
					for (int j = 1; j <= n; j ++)
						if (rt[j].city[1] == v) {
							int tmp = i;
							for (int k = 2; k < rt[j].city.size(); k ++) {
								if (tmp < l && rt[j].city[k] == path[tmp + 1]) tmp ++;
								g[{i, v}].push_back({j, {tmp, rt[j].city[k]}});
							}
						}
				}
			dijkstra({1, path[1]});
			cout << "Case " << cs << ", Trip " << trip << ": Cost = " << dist[{l, path[l]}].fi.fi << endl;
			PII End = {l, path[l]};
			std::vector<int> way;
			while (End != make_pair(1ll, path[1])) {
				way.push_back(dist[End].fi.se);
				End = dist[End].se;
			}
			reverse(way.begin(), way.end());
			cout << "  Tickets used: ";
			for (int i = 0; i < way.size(); i ++) {
				if (i == way.size() - 1) cout << way[i];
				else cout << way[i] << " ";
			}
			cout << endl;
			g.clear();
		}
	}

	return 0;
}

标签:rt,dist,int,精讲,1048,Air,heap,fi,se
From: https://www.cnblogs.com/Tiny-konnyaku/p/18256229

相关文章

  • 华为 无线控制器 AirEngine9700-M1 AirEngine5760-51 AP供电降档问题
    1故障现象,一台HuaweiSwitchS5720-28TP-PWR-LI-ACpoe交换机接入ap(5760-51)20个,其中一个网口灯不亮,随机拔掉一个AP网线,之前不亮的网口,正常闪亮启动。#AirEngine5760-51满载功率28.8wHuaweiSwitchS5720-28TP-PWR-LI-AC交换机满载功率369w,那明显超载造成的2控制......
  • D. Armchairs
    原题链接题解1.改变座位之后,保持人的相对顺序不变一定使答案不劣2.\(n\)不是很大,因此可以考虑\(O(n^2)\)的做法3.令\(dp[i][j]\)为第\(i\)个人移到位置\(j\),且\([1,i-1]\)的人都已经移到了最优位置时的最小花费,\(index[i]\)为第\(i\)个人的下标则\(dp[i][j]=\m......
  • Oracle数据库修复利器:DBMS_REPAIR包详解与实战
    在Oracle数据库中,数据文件的完整性和稳定性对于系统的正常运行至关重要。然而,由于各种原因(如硬件故障、软件错误等),数据文件有时会出现损坏,导致数据丢失或系统崩溃。为了应对这种情况,Oracle提供了DBMS_REPAIR包,这是一个强大的工具,可以帮助我们发现、标识并修复数据文件中的坏块。......
  • 【万字精讲】软件工程与项目管理知识点速通(简答,综合题向)
    软件工程与项目管理知识点速通(简答,综合题向)时间记录:24.61.为什么瀑布模型,原型模型,螺旋模型支持迭代开发?回答该问题,首先需要知道他们分别是什么(1)瀑布模型(WaterfallModel)瀑布模型传统上被认为是线性、顺序的开发模型,即各个阶段(需求、设计、实现、测试、部署、维护)按顺序......
  • MATLAB算法实战应用案例精讲-【数模应用】事后多重比较(附python、MATLAB和R语言代码实
    目录几个高频面试题目事后检验,多重比较,简单效应分析有什么区别?事后多重对比如何使用?算法原理SPSSAU疑难解惑提示‘数据质量异常’如何解决?如何做Dunnett法事后多重比较?方差分析事后多重比较提供‘字母标记法!’?关于方差分析时的效应量?字母标记法时没有输出结果?......
  • ReentrantLock的非公平锁(NonfairSync)深度解析:源码之旅与实战策略
    1.引言在Java并发编程中,ReentrantLock作为一种可重入的互斥锁,提供了比synchronized更强大和灵活的功能。其中,NonfairSync作为ReentrantLock内部非公平锁的实现,其设计理念和源码实现都体现了对性能和公平性的权衡。2.NonfairSync概述非公平锁特性:新到达的线程在......
  • Aligning with Human Judgement: The Role of Pairwise Preference in Large Language
    本文是LLM系列文章,针对《AligningwithHumanJudgement:TheRoleofPairwisePreferenceinLargeLanguageModelEvaluators》的翻译。与人类判断相一致:配对偏好在大型语言模型评估者中的作用摘要1引言2LLM计算器校准的局限性3不确定性引导的成对偏好搜索4......
  • Air Hockey Project
    Assignment3JumptobottomAirHockeyProjectObjectives:Inthisproject,youwillbestartingyour2-PlayerAirHockeyproject.CheckoutthegamedescriptionandonineAirHockeygametogetfamiliarisedwiththegame.Youwillbeaccomplishingthefoll......
  • Airsim-PX4-ROS仿真环境搭建
    AirSim项目地址:https://github.com/microsoft/AirSimAirSim官方教程:Home-AirSim(microsoft.github.io)CSDN参考教程:AirSim学习(1)安装UnrealEngine和AirSim视频教程:【AirSim】我有自己的无人机啦-bilibiliChrisLovett的讲解在自己的Windows上实现AirSim仿真......
  • MATLAB基础应用精讲-【数模应用】二元Logit分析
    目录算法原理数学模型极大似然法Newton牛顿迭代法logit回归分析步骤一、二元logit分析1.基本说明2.数据处理3.SPSSAU上传数据4.分析前提示5.SPSSAU分析6.其它说明二、多分类logit分析1.基本说明2.数据要求与处理3.SPSSAU上传数据4.SPSSAU分析5.其它说明三、......