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

CSP-J 2023 旅游巴士 题解

题目描述

有向图,1是入口,n是出口。每条道路行走耗时1 单位时间。巴士会在0,k,2k,3k…时刻开,小 Z坐巴士进入入口的时刻必须是 k 的倍数。坐巴士离开出口时刻也必须是 k 的倍数。不能在任何点 / 道路停留:一旦从起点出发,就必须不停走路,不能原地等待。每条道路有开放时间ai:走上这条道路的时刻必须≥ai。求最早离开出口的时刻(k 的倍数),无解输出 - 1。

暴力的思路

如果我确定了小 Z 进入景区的出发时刻 S(S一定是 k 的倍数:0,k,2k,3k…),那之后他就不停走路,每走一条边时间+1。
对每一个合法出发时间S,跑一遍 BFS,算出从S时刻出发,能到达n号点的最小到达时间。
然后在所有结果里,选出最小的、且是 k 倍数的到达时间。

暴力代码

#include<bits/stdc++.h>usingnamespacestd;intn,m,k;vector<pair<int,int>>g[10005];boolvis[10005][10005];intdist[10005][10005];intxbfs(intstart){memset(dist,0x3f,sizeof(dist));queue<pair<int,int>>q;dist[1][start%k]=start;q.push({1,start%k});while(!q.empty()){intu=q.front().first;intt=q.front().second;q.pop();inttime=dist[u][t];for(inti=0;i<g[u].size();i++){intv=g[u][i].first;inta=g[u][i].second;intnextime=time+1;if(nextime<a)continue;intnt=nextime%k;if(dist[v][nt]>nextime){dist[v][nt]=nextime;q.push({v,nt});}}}returndist[n][0];}voidbfs(){queue<pair<int,int>>q;q.push({1,0});while(!q.empty()){intu=q.front().first;intt=q.front().second;q.pop();if(u==n&&t%k==0){cout<<t;return;}if(vis[u][t%k]){continue;}vis[u][t%k]=1;for(inti=0;i<g[u].size();i++){q.push({g[u][i].first,t+1});}}cout<<-1;}intmain(){cin>>n>>m>>k;boolflag=true;intmaxn=0;while(m--){intu,v,w;cin>>u>>v>>w;maxn=max(maxn,w);g[u].push_back({v,w});if(w!=0){flag=false;}}if(flag){bfs();return0;}else{intl=0,r=maxn+n+k;intans=0x3f3f3f3f;while(l<=r){intmid=(l+r)/2;if(xbfs(mid)!=0x3f3f3f3f){ans=xbfs(mid);l=mid+1;}else{r=mid-1;}}if(ans==0x3f3f3f3f)cout<<-1;elsecout<<ans;}return0;}

AC思路

由于这道题是从一个点出发到另一个点的最短路径,所以我们可以考虑一下求最短路径的经典算法:dijkstra算法(狄杰斯特拉算法)。
视频讲解

AC代码

#include<bits/stdc++.h>usingnamespacestd;intn,m,k,ans=1e9;vector<vector<pair<int,int>>>g;boolvis[10005][105];voiddijkstra(){priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;q.push({0,1});while(!q.empty()){pair<int,int>cur=q.top();q.pop();intt=cur.first;intu=cur.second;if(u==n&&t%k==0){ans=min(ans,t);}if(vis[u][t%k])continue;vis[u][t%k]=1;for(inti=0;i<g[u].size();i++){intv=g[u][i].first;intw=g[u][i].second;intnt=t+1;if(nt<=w){nt+=(w-nt+k)/k*k;}q.push({nt,v});}}}intmain(){cin>>n>>m>>k;g.resize(n+1);for(inti=1;i<=m;i++){intu,v,w;cin>>u>>v>>w;g[u].push_back({v,w});}dijkstra();if(ans==1e9)cout<<-1;elsecout<<ans;return0;}
http://www.jsqmd.com/news/1391792/

相关文章:

  • Windows Defender 管理工具上手教程:三步永久禁用,一条命令恢复
  • 新手也能快速上手!ModernWMS开源仓库管理系统社区贡献终极指南:从第一个Issue到首个PR的全过程
  • 告别U盘和网盘搬运:3个场景让跨设备文件同步自动完成
  • 接口返回 200,用户说没收到——异步 API 的排查思路
  • 第七史诗自动挂机神器E7Helper全攻略:刷书签、讨伐、竞技场一站式解放双手
  • edge impulse导出的arduino库中出现头文件缺失:edge-impulse-sdk\porting\espressif\esp-dsp\modules\fft\fi...如何解决?
  • 上海创意网站建设:如何在海量同质化竞争中通过独特设计突围并实现品牌溢价与流量转化
  • 【ORC】在数据湖架构中,ORC 通常与哪些表格式(Hive Metastore, Iceberg, Hudi)配合使用?
  • Opus 4.8翻车记:硅谷最贵AI,开口第一句——“我是千问“
  • 无名杀网页版免费即开即玩:浏览器里体验完整三国杀的全指南
  • 操作系统那些事儿⑥:Unix 世界的另一条主线——System V、Solaris 与商业 Unix
  • 字节跳动面试题到底在考什么?116道LeetCode高频题给出的三个答案
  • 滨州网站建设招聘 揭秘中小团队突围背后的用人逻辑与真实需求
  • 手握滔天富贵仍不知足,一个野心毁掉了他的一生
  • 告别命令行与传输线:一个开源APK安装器把安卓应用装进Windows
  • 1600代码造出水下曼哈顿, Fable 5让Karpathy看呆了
  • 还在为分子可视化发愁?10分钟上手 Avogadro 2 开源分子建模软件
  • 【信息科学与工程学】【通信工程】第一百六十五篇 路由与交换的函数工程设计13
  • WarcraftHelper魔兽争霸3辅助插件:免费开源,一招解决宽屏适配与帧率解锁难题
  • 什么是PCB?-解决多层板电源噪声与PDN谐振
  • 工业级上位机(HMI / SCADA)的优秀开源框架源码推荐
  • 英雄联盟回放打不开怎么办?ROFL-Player 让旧版 .rofl 文件全部“复活“
  • 一文吃透 ECharts 多坐标系组合:从双轴混排到多网格联动的进阶实战
  • m4s转MP4免费指南:m4s-converter无损合并B站缓存视频,三分钟搞定播放
  • 中山东升DHL/UPS/FedEx国际快递 | 世邦物流上门取件 - 烟雾弥漫L
  • 浅谈tee命令
  • Photoshop WebP插件WebPShop上手指南:3分钟装好,动画导出与无损压缩一步到位
  • 大尺寸测量的“拼接难题”:图像拼接技术在服装尺寸测量中的精度损失与恢复策略
  • WebPShop 插件深度解析:Photoshop 里被低估的 WebP 动画与压缩控制
  • TokenPocket钱包前端加密与后端安全下载服务完整开发实践