C++ 算法考级专栏
真题分析、矩阵探测、递归回溯与基础语法
🎨 视觉封面【反向瓶颈最短路与Dijkstra最晚发车时间】GESP八级 / CSP-S 题解:luogu-P17462 [GESP202609 八级] 末班车
CCF GESP 2026年9月认证(第十五次认证)C++ 八级试题,洛谷 P17462。本题严格遵循 CCF GESP 官方大纲规范,重点考察反向瓶颈最短路与Dijkstra最晚发车时间。题目逻辑严密,模型典型,是深入理解与掌握信奥核心考点的经典范例。
P17462 [luogu-P17462 [GESP202609 八级] 末班车]
🔗 洛谷原题传送门:P17462
题目要求
题目描述
城市有 个地铁站, 条单向线路。第 条线路最晚发车时间 ,运行时间 ,每分钟均有列车发出。 有 组询问:给出起点 、终点 和出发时间 ,判断从 于时刻 出发能否到达 。
输入格式
第一行三个正整数 。 接下来 行每行四个整数 。 接下来 行每行三个整数 。
输出格式
输出 行,能到达输出 Yes,否则输出 No。
输入输出样例
样例输入 #1
3 4 5
1 2 3 3
2 3 5 2
3 1 4 1
1 3 0 6
1 3 2
2 1 2
2 1 3
3 2 2
3 2 3
样例输出 #1
Yes
Yes
No
Yes
No
说明/提示
。
题目分析与解题思路
- 单调性与瓶颈最晚出发时间: 由于乘客可以在站点等待,若时刻 能到达,则对于任何 也能到达。因此对于任意起点 和终点 ,存在一个最晚允许出发时间 ,使得可行条件为 。
- 逆向动态规划与最大化 Dijkstra:
极小,我们可以枚举终点 :
- 从终点 出发在反向边上跑最大化 Dijkstra;
- 设到达点 能够继续前往 的最晚时刻为 ;
- 对于原向边 (最晚发车 ,运行 ),若在时刻 离开 ,到达 为 。要求 且 ,因此从 最晚出发时刻为:
- 使用大根堆不断拓展松弛最大的可出发时刻 。
- 单次询问 回答: 预处理全源最晚出发时间仅需 次运算(几十毫秒)。之后 次询问直接 比较输出,整体高效平稳通过!
完整参考代码 (C++11)
/**
* Problem: luogu-P17462
* Standard: C++11 (CCF GESP 官方大纲规范)
* Author: OneCoder
*/
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
struct RevEdge {
int u;
long long l;
long long t;
};
const long long INF = 2e18;
long long max_depart[505][505];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m, q;
if (!(cin >> n >> m >> q)) return 0;
vector<vector<RevEdge>> rev_adj(n + 1);
for (int i = 0; i < m; ++i) {
int u, v;
long long l, t;
cin >> u >> v >> l >> t;
rev_adj[v].push_back({u, l, t});
}
// 初始化全源可达最晚时刻表
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
max_depart[i][j] = -1;
}
}
// 对每个终点 y 跑反向最大化 Dijkstra
for (int y = 1; y <= n; ++y) {
priority_queue<pair<long long, int>> pq;
max_depart[y][y] = INF;
pq.push({INF, y});
while (!pq.empty()) {
auto top = pq.top();
pq.pop();
long long cur_d = top.first;
int v = top.second;
if (cur_d < max_depart[v][y]) continue;
for (const auto& edge : rev_adj[v]) {
int u = edge.u;
long long nxt_d = min(edge.l, cur_d - edge.t);
if (nxt_d >= 0 && nxt_d > max_depart[u][y]) {
max_depart[u][y] = nxt_d;
pq.push({nxt_d, u});
}
}
}
}
// O(1) 快速回答每个询问
for (int i = 0; i < q; ++i) {
int x, y;
long long s;
cin >> x >> y >> s;
if (s <= max_depart[x][y]) {
cout << "Yes\n";
} else {
cout << "No\n";
}
}
return 0;
}
考点归纳与备考建议
- 考纲匹配度:严格对标 CCF GESP 八级考纲重点,绝不超纲,注重基础算法与逻辑建模规范;
- 规范防范:所有代码严格以 C++11 标准编译运行,针对整数溢出、边界判断、空状态均做了详尽严整的防御性处理。
所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI
欢迎加入:C++ GESP/CSP 考级答疑群(688906745) 与 Java/Python交流群(982860385),点击可直接加群。
猜你想读 · 相关文章推荐
【仙人掌图性质与乘法原理生成树计数】GESP八级 / CSP-S 题解:luogu-P17461 [GESP202609 八级] 生成树计数
CCF GESP 2026年9月认证(第十五次认证)C++ 八级试题,洛谷 P17461。本题严格遵循 CCF GESP 官方大纲规范,重点考察仙人掌图性质与乘法原理生成树计数。题目逻辑严密,模型典型,是深入理解与掌握信奥核心考点的经典范例。
【图论·全源可达性与割点检测】GESP七级 / CSP-S 题解:luogu-P17459 [GESP202609 七级] 必经之路
CCF GESP 2026年9月认证(第十五次认证)C++ 七级试题,洛谷 P17459。本题严格遵循 CCF GESP 官方大纲规范,重点考察图论·全源可达性与割点检测。题目逻辑严密,模型典型,是深入理解与掌握信奥核心考点的经典范例。
【括号序列平衡度与子序列计数DP】GESP七级 / CSP-S 题解:luogu-P17460 [GESP202609 七级] 括号序列
CCF GESP 2026年9月认证(第十五次认证)C++ 七级试题,洛谷 P17460。本题严格遵循 CCF GESP 官方大纲规范,重点考察括号序列平衡度与子序列计数DP。题目逻辑严密,模型典型,是深入理解与掌握信奥核心考点的经典范例。
OneCoder (lihongzheshuai)
一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com