P9751 [CSP-J 2023] 旅游巴士 题解
1.P9748 [CSP-J 2023] 小苹果 题解2.P9749 [CSP-J 2023] 公路 题解
3.P9751 [CSP-J 2023] 旅游巴士 题解
4.P9750 [CSP-J 2023] 一元二次方程 题解5.P8813 [CSP-J 2022] 乘方 题解6.P8814 [CSP-J 2022] 解密 题解7.P8815 [CSP-J 2022] 逻辑表达式 题解8.P8816 [CSP-J 2022] 上升点列 题解9.P7909 [CSP-J 2021] 分糖果10.P7910 [CSP-J 2021] 插入排序 题解11.P7911 [CSP-J 2021] 网络连接 题解12.P7912 [CSP-J 2021] 小熊的果篮 题解13.P7071 [CSP-J2020] 优秀的拆分 题解14.P7072 [CSP-J2020] 直播获奖 题解15.[CSP-J2020] 表达式 题解16.P7074 [CSP-J2020] 方格取数 题解17.P5661 [CSP-J2019] 公交换乘 题解18.P5662 [CSP-J2019] 纪念品 题解19.P5663 [CSP-J2019] 加工零件 题解20.P5660 [CSP-J2019] 数字游戏 题解21.P11227 [CSP-J 2024] 扑克牌 题解22.P11228 [CSP-J 2024] 地图探险 题解23.P11229 [CSP-J 2024] 小木棍 题解24.P10124 [USACO18OPEN] Family Tree B 题解25.P9008 [入门赛 #9] 大碗宽面26.题解:AT_abc018_4 [ABC018D] バレンタインデー27.正规数的判定->题解28.逆波兰式->题解29.题解:P11372 「CZOI-R2」加训30.题解:AT_abc032_d [ABC032D] ナップサック問題31.题解:P11389 [COCI 2024/2025 #1] 等级 / Hijerarhija32.题解:B4070 [GESP202412 五级] 奇妙数字思路
首先,举一个例子,假如说 小Z 到了入口,但是没到时间,所以没法进去,该怎么办?
当然是等
除此之外,像到了其他景区,但是还没开门怎么办 ? 继续等
知道这个后,我们先定义状态
目标:
为什么要取模呢? 因为这样不仅可以方便计算,而且题面中说到,到达和离开景区的时间均要是
转移
显然,这题可以使用最短路,我们在求最短路的同时进行转移.关于最短路算法,建议选择优先队列优化过后的
代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<queue> using namespace std; int n, m, k; int f[10004][102]; // f[i][j]表示到点i,长度%k余数为j的最早时间 struct q{ int id, mod, cost; // 节点编号,j,时间 bool friend operator < (q a, q b) { // 重载小于运算符 return a.cost > b.cost; } }; struct node { int v, w; }; int vis[10004][102]; vector<node> g[10004]; // vector 存图 priority_queue<q> pq; // 优先队列 void dijkstra() { pq.push((q){1, 0, 0}); // 最开始的元素 while (!pq.empty()) { q h = pq.top(); pq.pop(); int u = h.id, j = h.mod, cost = h.cost; // 没有被访问过,更新 f[u][j] if (!vis[u][j]) f[u][j] = cost, vis[u][j] = 1; else continue; for (int i = 0; i < g[u].size(); i++) { int v = g[u][i].v, w = g[u][i].w; int t = f[u][j]; while (t < w) t += k; // 还没有开门,就继续等 if (t + 1 < f[v][(j+1)%k]) // 更早的时间 pq.push((q){v, (j+1)%k, t + 1}); // 放入优先队列 } } } int main() { scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= m; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); g[u].push_back((node){v, w}); } memset(f, 0x3f, sizeof(f)); // 初始化,较大的初值 dijkstra(); if (f[n][0] != 0x3f3f3f3f) printf("%d", f[n][0]); // 不是初值,说明可以到达 else printf("-1"); return 0; }
本文作者:Panda_LYL
本文链接:https://www.cnblogs.com/panda-lyl/p/18493786
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步