NC26257 小雨坐地铁
题目
题目描述
小雨所在的城市一共有 \(m\) 条地铁线,分别标号为 1 号线,2 号线,……,m 号线。整个城市一共有 \(n\) 个车站,编号为 \(1 \sim n\) 。其中坐 i 号线需要花费 \(a_i\) 的价格,每坐一站就需要多花费 \(b_i\) 的价格。i 号线有 \(c_i\) 个车站,而且这 \(c_i\) 个车站都已知,如果某一站有多条地铁线经过,则可以在这一站换乘到另一条地铁线,并且能多次换乘。现在小雨想从第 s 个车站坐地铁到第 t 个车站,地铁等待时间忽略不计,求最少花费的价格,若不能到达输出 -1 。(地铁是双向的,所以 s 可能大于 t)
输入描述
第一行输入四个正整数 \(n,m,s,t\),分别表示车站个数,地铁线数,起点站和终点站。
第二行到第 \(m + 1\) 行,每行前三个数为 \(a_i,b_i,c_i\),分别表示坐 i 号线的价格,i 号线每坐一站多花的价格,i 号线车站个数。接下来 \(c_i\) 个数,表示 i 号线的每一个车站的编号,单调递增。
输出描述
共一行,一个数表示最小花费,若不能到达输出 -1 。
示例1
输入
5 2 1 4
2 2 3 1 3 5
2 1 4 2 3 4 5
输出
7
说明
坐 1 号线:花费 2;
\(1 \rightarrow 3\) :花费 2;
换乘 2 号线:花费 2;
\(3 \rightarrow 4\) :花费 1;
所以最小总花费为 7 。
备注
\(1 \leq n \leq 10^3, 1 \leq m \leq 500,1 \leq s,t \leq n\)
\(1 \leq a_i,b_i \leq 100,1 \leq c_i \leq n,\sum\limits_{i = 1}^m c_i \leq 10^5\)
题解
知识点:图论建模,最短路。
利用分层图建模,每条地铁单独建立 \(n\) 个点。再额外建立 \(n\) 个点作为换乘的点,连接每条地铁每站。
最后跑最短路即可。
时间复杂度 \(O((nm+\sum c_i)\log\sum c_i)\)
空间复杂度 \(O(nm+\sum c_i)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e3 * 501 + 7, M = 4 * 1e5 + 7;
template<class T>
struct Graph {
struct edge {
int v, nxt;
T w;
};
int idx;
vector<int> h;
vector<edge> e;
Graph(int n, int m) :idx(0), h(n + 1), e(m + 1) {}
void clear(int n, int m) {//全局使用时清零,确定范围防止超时
idx = 0;
h.assign(n + 1, 0);
e.assign(m + 1, { 0,0,0 });
}
void add(int u, int v, T w) {
e[++idx] = edge{ v,h[u],w };
h[u] = idx;
}
};
Graph<int> g(N, M);
bool vis[N];
int dis[N];
struct node {
int v, w;
friend bool operator<(node a, node b) {
return a.w > b.w;
}
};
priority_queue<node> pq;
void dijkstra(int st) {
memset(dis, 0x3f, sizeof(dis));
dis[st] = 0;
pq.push({ st,0 });
while (!pq.empty()) {
int u = pq.top().v;
pq.pop();
if (vis[u]) continue;
vis[u] = 1;
for (int i = g.h[u];i;i = g.e[i].nxt) {
int v = g.e[i].v, w = g.e[i].w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
pq.push({ v,dis[v] });
}
}
}
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m, s, t;
cin >> n >> m >> s >> t;
for (int i = 1;i <= m;i++) {
int a, b, c;
cin >> a >> b >> c;
int pre = 0;
while (c--) {
int x;
cin >> x;
if (pre) {
g.add(pre + i * n, x + i * n, b);
g.add(x + i * n, pre + i * n, b);
}
//每层用以站点在不同线路连接,第一层当作站点,用以换乘
g.add(x, x + i * n, a);
g.add(x + i * n, x, 0);
pre = x;
}
}
dijkstra(s);
cout << (dis[t] > 1e9 ? -1 : dis[t]) << '\n';
return 0;
}
NC26257 小雨坐地铁的更多相关文章
- Python写地铁的到站的原理简易版
Python地铁的到站流程及原理(个人理解) 今天坐地铁看着站牌就莫名的想如果用Python写其工作原理 是不是很简单就小试牛刀了下大佬们勿喷纯属小弟个人理解 首先来看看地铁上显示的站牌如下: 就想这 ...
- 北京地铁月度消费总金额计算(Python版)
最近业余时间在学习Python,这是那天坐地铁时突发奇想,想看看我这一个月的地铁费共多少钱,所以简单的构思了下思路,就直接开写了,没想到用Python来实现还挺简单的. 设计思路: 每次乘车正常消费7 ...
- TWaver初学实战——基于HTML5的交互式地铁图
每天坐地铁,经常看地铁图,有一天突然想到,地铁图不也是一种拓扑结果吗?TWaver到底能与地铁图擦出怎样的火花呢? 想到就干,先到网上找幅参考图.各种风格的地铁图还挺多,甚至有大学生自主设计制作, ...
- 用C#开发的一个通用的地铁换乘查询工具
日常生活中,上班下班坐地铁已经是常事,每当我想去某一个远一点的地方,如果有地铁首选就是地铁,因为方便嘛!每次坐地铁,我们都是凭肉眼去得出我们心中最佳的换乘方案,但是,如果对于线路较少的城市来说,这个方 ...
- 【luogu P4005 清华集训2017】小Y和地铁
题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...
- POJ2502乘坐地铁上学
POJ2502 题目大意:给你一个二维地图,起点终点,以及多条地铁线路(只有相邻两站才可互通)中的站点坐标.步行以及坐地铁的速度: 思路:难点在于建图,一个多小时磨磨蹭蹭,都是因为思路没捋清楚~~,对 ...
- P4005 小 Y 和地铁
题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...
- 【清华集训】小Y和地铁
图已挂,前往luogu 题目: 小 $\rm Y$ 是一个爱好旅行的 $\rm OIer$.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁.她发现每条地铁线路可以看成平面上的一条 ...
- [LOJ#2323]「清华集训 2017」小Y和地铁
[LOJ#2323]「清华集训 2017」小Y和地铁 试题描述 小Y是一个爱好旅行的OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的 ...
- 2017年AR大会上海站干货分享
怀着即兴奋又激动的心情,踏上了第二次去上海的高铁,全长约1400公里行驶6小时15分钟,不算漫长的6个多小时里,对于不长出差的我来说,可谓是一种煎熬,再加上晕车的毛病,在去高铁的路上已经渐渐发作,但好 ...
随机推荐
- 精通 VS 调试技巧,学习与工作效率翻倍!
欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 1. 什么是调试 当我们写代码时候常常会遇见输出结果不符合我们预期的情 ...
- PG数据库存储验证
PG数据库存储验证 背景 最近学习了SQLServer数据库的varchar和nvarchar的存储 想到PG数据库其实没让选择字符集,也没有nvarchar 所以想学习一下nvarchar的使用情况 ...
- [转帖]Jmeter接口测试:参数化
Jmeter接口请求中的参数经常需要通过参数进行赋值 引用形式:${} 变量时:${变量名} 函数时,${_函数名(参数1,参数2,参数3)} 值中"${n}"中,n为变量名:&q ...
- Jmeter学习之三_知识梳理
Jmeter学习之三_知识梳理 背景 简单学习了Jmeter的两个用例 感觉可以继续深入学习一下Jmeter了. 所以想着趁体检入职之前继续学习完善一下. 希望能够继续提高 Jmeter的相关知识 1 ...
- [转帖]一起来体验96核心、192线程CPU——第四代AMD EPYC处理器独家测试
http://k.sina.com.cn/article_1882475282_70344b12027010s1x.html 与第三代EPYC 7003系列处理器相比,新一代EPYC 9004系列处理 ...
- 查找linux下面某目录下重名出现的文件以及次数
find . -name '*.data' -exec basename {} \;| sort | uniq -w32 --all-repeated=separate | uniq -c | sor ...
- 使用shell进行简单分析增量更新时间的方法
使用shell进行简单分析增量更新时间的方法 思路 产品里面更新增量时耗时较久, 想着能够简单分析下哪些补丁更新时间久 哪些相同前缀的补丁更新的时间累积较久. 本来想通过全shell的方式进行处理 但 ...
- SHA加密在实际应用中的优势与局限
SHA加密算法简介 SHA(Secure Hash Algorithm)加密算法是一种单向加密算法,常用于加密数据的完整性校验和加密签名.它是由美国国家安全局(NSA)设计并广泛应用于各种安全场景.S ...
- 【AIGC】只要10秒,AI生成IP海报,解放双手!!!
看完这篇文章,你将学会以下价值连城的内容 1.云端部署(配置不行的小伙伴看)+ 云端模型放置位置 2.本地部署(配置达标的小伙伴看) 3.运用SD训练IP的流程和技巧(LoRA篇) 4.运用SD稳定生 ...
- echarts api的介绍
参考的地址:https://echarts.apache.org/zh/api.html echarts.init echarts.init(dom?: HTMLDivElement|HTMLCanv ...