当前位置: 首页 > news >正文

P9751 [CSP-J 2023] 旅游巴士

题目要求时间必须是 k k k 的非负整数倍,所以想到了升维。这样就变成了一道分层图最短路的题目。用 BFS 算法可以拿到 A i = 0 A_i=0 Ai=0 35 35 35 分。

  • 满分思路

其实部分分的思路已经很接近正解了,想要拿到满分只需要做一点小小的调整。虽然说不能在路上停留,但是我们可以晚一点到达起点。但是要注意:到达起点的时间也必须是 k k k 的倍数。这个做法 BFS 就解决不了了(它只能解决出发时间相同且边权为 1 1 1 的最短路问题),我们可以使用 Dijkstra 算法来解决这道题。时间复杂度约 O ( O( O( n n n + + + m ⋅ l o g 2 m m \cdot log_2m mlog2m ) ) )

  • 代码

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
#include <cmath>
using namespace std;
const int INF = 0x3f3f3f3f; // 极大值∞int n, m, k;
int dis[10010][110]; // 最短路
int vis[10010][110]; // 记录点有没有被选过struct edge // 边
{int y, w;
} ;struct node // 优先队列中的点
{int x, t, d;bool operator < (const node b) const // 重载运算符{return d > b.d;}
} ;vector<edge> g[10010]; // 图void add(int x, int y, int w) // 建边
{g[x].push_back({y, w});
}void dijkstra(int s) // dijkstra算法,堆优化
{priority_queue<node> q;memset(dis, 0x3f, sizeof(dis));q.push({s, 0, 0});dis[s][0] = 0;while (q.size()){int x = q.top().x;int t = q.top().t;q.pop();if (vis[x][t])continue;vis[x][t] = 1;int nt = (t + 1) % k;for (int i = 0; i < g[x].size(); i++){int y = g[x][i].y;int w = g[x][i].w;int d = dis[x][t];if (d < w) d += (w - d + k - 1) / k * k; // 到达起点时间if (dis[y][nt] > d + 1){dis[y][nt] = d + 1;q.push({y, nt, dis[y][nt]});}}}
}int main()
{cin >> n >> m >> k;for (int i = 1; i <= m; i++){int u, v, w;cin >> u >> v >> w;add(u, v, w); // 建条单向边}dijkstra(1);if (dis[n][0] == INF)cout << "-1" << endl; // 无解else cout << dis[n][0] << endl;return 0;
}
http://www.lryc.cn/news/457276.html

相关文章:

  • 【Linux】man手册安装使用
  • mysql学习教程,从入门到精通,SQL处理重复数据(39)
  • mapbox解决wmts请求乱码问题
  • 《C++职场中设计模式的学习与应用:开启高效编程之旅》
  • Maya动画--基础约束
  • 腾讯云License 相关
  • 开放式耳机什么品牌最好?十大超好用开放式耳机排名!
  • 基于Zynq SDIO WiFi移植二(支持2.4/5G)
  • Spring Boot敏感数据动态配置:深入实践与安全性提升
  • 软考数据库部分 ---- (概念数据库模型,三级模式,两级映像,事物管理)
  • AI 概念大杂烩
  • Composer和PHP有什么关系
  • 【PGCCC】在 Postgres 上构建图像搜索引擎
  • 性能测试之性能问题分析
  • 错过了A股,别再错过AI表情包!N款变现攻略,你选哪个?
  • SpringBoot驱动的美发沙龙管理系统:优雅地管理您的业务
  • prometheus + alertmanager 搭建告警通知
  • 爬虫案例——爬取腾讯社招
  • VAS1800Q奇力科技线性芯片电荷泵热处理
  • SQL Inject-基于报错的信息获取
  • redistemplate宇jedis区别
  • JavaWeb--09Servlet深入:JavaWeb三层架构---注册系统
  • 教育技术革新:SpringBoot在线教育系统开发指南
  • EasyAnimate
  • Unity实现自定义图集(五)
  • 2024年最佳平替电容笔对比:西圣、摩米士、倍思,哪款更适合你?
  • 关系型数据库索引操作
  • 深度学习基础—卷积神经网络示例
  • vite学习教程03、vite+vue2打包配置
  • Java | Leetcode Java题解之第461题汉明距离