UVA1048/LA3561 Low Cost Air Travel

UVA1048/LA3561 Low Cost Air Travel

  • 题目链接
  • 题意
      • 输入格式
      • 输出格式
  • 分析
  • AC 代码

题目链接

   本题是2006年ICPC世界总决赛的A题

题意

   很多航空公司都会出售一种联票,要求从头坐,上飞机时上缴机票,可以在中途任何一站下飞机。比如,假设你有一张“城市1->城市2->城市3”的联票,你不能用来只从城市2飞到城市3(因为必须从头坐),也不能先从城市1飞到城市2再用其他票飞到其他城市玩,回到城市2后再用原来的机票飞到城市3(因为机票已经上缴)。
   这里有一个例子。假设有3种票,每种票的情况如下所示:
    ∙ \bullet 票1:城市1->城市3->城市4,票价225美元
    ∙ \bullet 票2:城市1->城市2,票价200美元
    ∙ \bullet 票3:城市2->城市3,票价50美元
   你想从城市1飞到城市3,有两种方法可以选择。买票1,只飞第一段;买票2和3,通过城市2中转。显然,第一种方法比较省钱,虽然浪费了一段。
   给出票的信息,以及一个或多个行程单,你的任务是买尽量少的票(同一种票可以买多张),使得总花费最小。输入保证行程总是可行的。行程单上的城市必须按顺序到达,但中间可以经过一些辅助城市。

输入格式

   输入包含多组数据。每组数据第一行为一个整数NT,即联票的种类数。以下NT行每行为一个联票描述,其中第一个整数为票的价格,然后是联票上城市的数目以及这些城市的整数编号(按顺序给出)。接下来为一个整数NI,即需要计算最小花费的行程单数目。以下NI行每行为一个行程单,其中一个整数为行程单上的城市数目(包括起始城市),以及这些城市的编号(按顺序给出,每个城市编号可取任意整数但唯一)。输入保证每组数据最多包含20种联票和20个行程单,每张票或者行程单上有至少2个,最多10个城市。票价不超过$10000。联票或者行程单上的相邻城市保证不同。票和行程单都从1开始编号。输入结束标志为NT=0。

输出格式

   对于每组数据的每张行程单,输出最小花费和对应的方案(按顺序,详见样例输出)。输出保证唯一。

分析

   题目交代每个城市的编号是任意整数但唯一,因此需要对城市重新编号(不同城市最多200个)。行程单上的城市必须按顺序到达,但中间可以经过一些辅助城市,这里其实隐含了一点:只能从行程单的首个城市作为初始出发点。
   充分理解题意之后,可以知道本题其实是单源最短路问题,可以用spfa处理,只不过需要重新定义状态点:d[i][j]表是当前旅行到了城市i,已经走完行程单前j个城市的最小花费。
   可以用结构体struct {int v, k, t;} ans[N][M]记录最短路径:ans[i][j]记录当前旅行到了城市i,已经走完行程单前j个城市花费最小时,上个行程旅行到了城市v,已经走完行程单前k个城市,对应转机的机票t。

AC 代码

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

#define T 21
#define M 11
#define N 202
int d[N][M], f[N][M], a[T][M], w[T], c[T], b[M], id[N], m, n, t, x, kase = 0;
struct node {int v, k;} p; struct {int v, k, i;} ans[N][M];

int find(int v) {
    for (int i=0; i<x; ++i) if (id[i] == v) return i;
    id[x] = v;
    return x++;
}

int bfs() {
    cin >> m;
    for (int i=0, v; i<m; ++i) cin >> v, b[i] = find(v);
    memset(d, 1, sizeof(d)); memset(f, 0, sizeof(f)); queue<node> q;
    for (int i=1; i<=t; ++i) if (a[i][0] == b[0]) for (int j=1, k=1, v; j<c[i] && k<m; ++j) {
        if ((v = a[i][j]) == b[k]) ++k;
        if (w[i] < d[v][k]) {
            d[v][k] = w[i]; ans[v][k] = {0, 0, i};
            if (k<m && !f[v][k]) q.push({v, k}), f[v][k] = 1;
        }
    }
    while (!q.empty()) {
        p = q.front(); q.pop();
        int v0 = p.v, k0 = p.k, g = d[v0][k0]; f[v0][k0] = 0;
        for (int i=1; i<=t; ++i) if (a[i][0] == v0) for (int j=1, k=k0, v; j<c[i] && k<m; ++j) {
            if ((v = a[i][j]) == b[k]) ++k;
            if (g + w[i] < d[v][k]) {
                d[v][k] = g + w[i]; ans[v][k] = {v0, k0, i};
                if (k<m && !f[v][k]) q.push({v, k}), f[v][k] = 1;
            }
        }
    }
    return d[b[m-1]][m];
}

void path(int v, int k) {
    if (ans[v][k].k) path(ans[v][k].v, ans[v][k].k);
    cout << ' ' << ans[v][k].i;
}

void solve() {
    x = 0;
    for (int i=1; i<=t; ++i) {
        cin >> w[i] >> c[i];
        for (int j=0, v; j<c[i]; ++j) cin >> v, a[i][j] = find(v);
    }
    cin >> n; ++kase;
    for (int i=1; i<=n; ++i) {
        cout << "Case " << kase << ", Trip " << i << ": Cost = " << bfs() << endl << "  Tickets used:";
        path(b[m-1], m); cout << endl;
    }
}

int main() {
    while (cin >> t && t) solve();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/600364.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

就业班 第三阶段(redis) 2401--5.7 day2 redis2 哨兵(前提是做好了主从)+redis集群

1、设置密码&#xff08;redis&#xff09; 先在redis.conf里面找到这个 后面写上要设置的密码即可 2、哨兵模式 监控redis集群中master状态的的工具 在做了主从的前提下 主 从1 从2 作用 1)&#xff1a;Master状态检测 2)&#xff1a;如果Master异常&#xff0c;则会进行…

2-5 任务:打印九九表

本次实战的目标是通过编写程序实现打印九九乘法表、字符矩形、字符平行四边形和字符菱形等图形&#xff0c;以及解决百钱买百鸡问题和输出素数等实际问题。在实战过程中&#xff0c;我们将学习并掌握以下知识点。 双重循环的使用&#xff1a;通过双重循环实现九九乘法表的打印&…

告别杂乱桌面,开启纯净视界!DeskCover Pro,Mac用户的桌面神器!

DeskCover Pro for Mac是一款专为macOS设计的桌面图标隐藏软件&#xff0c;其主要功能和特点包括&#xff1a; 桌面图标隐藏&#xff1a;通过单击鼠标或按全局热键&#xff0c;可以快速隐藏桌面上的所有图标&#xff0c;为您提供一个干净整洁的工作环境。窗口聚焦&#xff1a;…

证券基金信创联盟研讨会:YashanDB分享金融核心数据库技术实践

4月26日&#xff0c;由证券基金行业信息技术应用创新联盟主办、WG3稽核风控系统工作组承办、国信证券股份有限公司协办的信创联盟2024年度系列研讨会第三期-稽核风控系统信创实践成功举办。国内头部企业国信证券、申万宏源证券、信达证券、国金证券、广发证券等单位共计300余人…

【数据结构】链表经典OJ题目练习(2)

面试题 02.02. 返回倒数第 k 个节点 - 力扣&#xff08;LeetCode&#xff09; 思路1&#xff1a;先计算出链表的长度&#xff0c;在将链表中的值存在数组中&#xff0c;在返回第k个节点。 思路2&#xff1a;利用快慢指针&#xff0c;先让快指针走k步&#xff0c;在让快慢指针分…

[译]Elasticsearch _source Doc_values And Store Performance

原文地址 https://sease.io/2021/02/field-retrieval-performance-in-elasticsearch.html 在这篇博文中&#xff0c;我想从性能的角度探讨 Elasticsearch 为我们存储字段和查询时检索字段提供了哪些可能性。 事实上&#xff0c;Lucene&#xff08;Elasticsearch 和 Solr 构建的…

详细分析Mybatis与MybatisPlus中分页查询的差异(附Demo)

目录 前言1. Mybatis2. MybatisPlus3. 实战 前言 更多的知识点推荐阅读&#xff1a; 【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09;java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09; 本章节主要以Demo为例&#xff…

122. Kafka问题与解决实践

文章目录 前言顺序问题1. 为什么要保证消息的顺序&#xff1f;2.如何保证消息顺序&#xff1f;3.出现意外4.解决过程 消息积压1. 消息体过大2. 路由规则不合理3. 批量操作引起的连锁反应4. 表过大 主键冲突数据库主从延迟重复消费多环境消费问题后记 前言 假如有家公司是做餐饮…

3行代码,实现一个取色器

前言 今天发现了一个很好玩的 API ——EyeDropper。 EyeDropper API 提供了一种创建拾色器工具的机制。使用该工具,用户可以从屏幕上取样颜色,包括浏览器窗口之外的区域。 这是 MDN 上对它的介绍,可以取包括浏览器窗口之外的区域。我们一起看看是怎么个事 什么是取色器 取…

24年最新AI数字人简单混剪

24年最新AI数字人简单混剪 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#xff1a;0b8x

【C 数据结构-图】2. 图的存储结构

文章目录 【 1. 图的顺序存储结构 】1.1 基本原理1.2 顺序存储结构的 C 实现 【 2. 图的链式存储结构 】2.1 图的临接表存储结构2.1.1 临接表的 基本原理2.1.2 临接表的 链表节点2.1.3 邻接表 各结构体的C实现2.1.4 临接表 计算顶点的出度和入度邻接表计算 无向图的出度和入度邻…

【Fastadmin】后台角色组权限问题(multi,开关switch,控制器新增方法)

1.列表开关类型的权限 如图&#xff1a; 此类开关请求的方法为multi 开关在点击的时候默认是只允许修改数据库的status字段的&#xff0c;如果我们开关不是status字段&#xff0c;我们需要在服务端对应的控制器中定义protected $multiFields"id,name,swith";&#x…

一个物业管理服务项目的思考——智慧停车场无人值守呼叫系统到电梯五方对讲再到呼叫中心

目录 起源智慧停车场无人值守呼叫系统然后电梯五方对讲系统又然后物业呼叫中心集控E控中心怎么做 起源 小区里新装了智慧停车场系统&#xff0c;马上展现出了科技化、现代化的新形象。一个显著的好处是&#xff1a;停车场的出入口&#xff0c;再也看不到司机和保安争吵的场景了…

四川景源畅信:抖音的运营策略有哪些?

在数字营销的大潮中&#xff0c;抖音以其巨大的用户基础和强大的传播力成为众多品牌和商家的必争之地。那么&#xff0c;抖音的运营策略有哪些呢?这个问题涉及到内容创作、用户互动、数据分析和品牌合作等多个方面。 一、内容创作与优化在抖音&#xff0c;内容是吸引用户的关键…

C++ 数据内存分布揭秘:从栈到堆的探索之旅

目录 1. 栈(Stack) 2. 堆(Heap) malloc和new的区别 堆与栈在C中的异同点详解 3. 数据段(Data Segment) 4. 代码段(Code Segment) 5. 动态内存分配的陷阱 当我们谈论C编程时&#xff0c;对内存布局的理解至关重要。本文将深入探讨C中各种变量和数据结构在内存中的分布情况…

这些CTF,不仅学技术,还有巨额奖金!

前言&#xff1a; 不会吧&#xff0c;不会吧&#xff0c;不会还有安全er不知道CTF是什么吧&#xff1f; 在程序员的世界里&#xff0c;也有ACM这样的编程大赛&#xff0c;成为各路编程高手一较高下展示能力的平台。 那在网络安全的圈子里&#xff0c;各路黑客红客白帽子们又…

rag-embeddings基础流程

什么是检索增强的生成模型 LLM 固有的局限性 LLM 的知识不是实时的LLM 可能不知道你私有的领域/业务知识 检索增强生成 RAG&#xff08;Retrieval Augmented Generation&#xff09;顾名思义&#xff0c;通过检索的方法来增强生成模型的能力。 类比&#xff1a;你可以把这个…

linux 内核编译

目录 Linux操作系统框架 Linux内核的主要功能&#xff1a; Linux的内核目录结构&#xff1a; 结构图: 详细介绍&#xff1a; uname - a 补充 编译之前 UTC 时间补充 Linux内核编译流程: 方法一: 官方内核编译: 1. 运行 build.sh 脚本&#xff0c; 记得加 sudo 权…

Day 24 数据库管理及数据类型

数据库管理及数据类型 一&#xff1a;数据类型 1.数值类型 整数类型 ​ 整数类型&#xff1a;TINYINT SMALLINT MEDIUMINT INT BIGINT ​ 作用&#xff1a;用于存储用户的年龄、游戏的Level、经验值等 浮点数类型 ​ 浮点数类型&#xff1a;FLOAT DOUBLE ​ 作用&#xf…

linux或ubuntu环境下需要自行安装vivado USB Program下载程序驱动

如果在linux或ubuntu环境下&#xff0c;不安装驱动是无法下载FPGA程序的。在linux或ubuntu环境下安装程序不要自动安装。 johnjohn-wang:~/vitis2021.2/Vivado/2021.2/data/xicom/cable_drivers/lin64/install_script/install_drivers$ sudo ./install_drivers
最新文章