【题意】

在一个赛车比赛中,赛道有\(n(n<=300)\)个交叉点和\(m(m<=50000)\)条单向道路。有趣的是,每条道路都是周期性关闭的。每条道路用5个整数\(u,v,a,b,t\)组成。\((1<=u,v<=n,1<=a,b,t<=10^5)\),表示起点是\(u\),终点是\(v\),通过的时间为\(t\)秒。另外,这条路会打开\(a\)秒,然后关闭\(b\)秒,然后再打开\(a\)秒...依次类推。当比赛开始时,每条道路刚刚打开。你的赛车必须在道路打开时进入该道路,并且在它关闭前离开(进出道路不耗费时间,也就是说你可以在打开的瞬间进入,在关闭的瞬间离开)。

你的任务是从\(s\)出发,尽早到达目的地\(t(1<=s,t<=n)\)。道路的起点和终点不会相同,但是有可能两条道路的起点和终点分别相同 (也就是说可能有重边,但不会有自环)

【算法】

\(\text{最短路}\)

【分析】

本题是一道最短路问题,但是与别的问题不同的是:花费的总时间并不是经过每条边的通过时间之和,还要加上在每个点的等待总时间。我们仍然调用标准的最短路算法(这里用\(Dijkstra\)),计算边权要分情况讨论

分情况讨论边权

  • 该道路处于关闭状态:边权=通过时间+(关闭时间-已关闭时间)

  • 该道路处于开启状态

    • 剩下的开启时间足够通过:边权=通过时间

    • 剩下的开启时间不够通过:边权=通过时间+关闭时间+(开启时间-已开启时间)

那我们要怎么判断一条道路是否开启或关闭呢?

答案是 \(res=\text{时间}\)%\((\text{开启时间}+\text{关闭时间})\)。如果\(res>\text{开启时间}\),说明此道路关闭,反之此道路开启(自己想一想,应该能相通的)

【代码】

细节上面已经说的很清楚了 (也方便进行复制),就不加注释了

#include<bits/stdc++.h>
using namespace std;
const int MAXN=350;
int n,m,s,t;
vector<int>ver[MAXN];
vector<int>edge[MAXN];
vector<int>a[MAXN],b[MAXN];
bool vis[MAXN];
int d[MAXN];
int T;
struct Node
{
int pos,dis;
bool operator < (const Node &x) const
{
return x.dis<dis;
}
};
inline int read()
{
int tot=0;
char c=getchar();
while(c<'0'||c>'9')
c=getchar();
while(c>='0'&&c<='9')
{
tot=tot*10+c-'0';
c=getchar();
}
return tot;
}
inline void dijkstra()
{
priority_queue<Node>q;
while(q.size())q.pop();
q.push((Node){s,0});
d[s]=0;
while(q.size())
{
Node now=q.top();
q.pop();
int x=now.pos,y=now.dis;
if(vis[x])continue;
vis[x]=1;
for(int i=0;i<ver[x].size();i++)
{
int tt=ver[x][i];
int res=y%(a[x][i]+b[x][i]);
if(res>=a[x][i])
{
if(res-a[x][i]==0&&b[x][i]+edge[x][i]+y<d[tt])
{
d[tt]=b[x][i]+edge[x][i]+y;
if(!vis[tt])q.push((Node){tt,d[tt]});
}
else if(res-a[x][i]>0&&b[x][i]-(res-a[x][i])+edge[x][i]+y<d[tt])
{
d[tt]=b[x][i]-(res-a[x][i])+edge[x][i]+y;
if(!vis[tt])q.push((Node){tt,d[tt]});
}
}
else
{
if(a[x][i]-res>=edge[x][i]&&edge[x][i]+y<d[tt])
{
d[tt]=edge[x][i]+y;
if(!vis[tt])q.push((Node){tt,d[tt]});
}
else if(a[x][i]-res<edge[x][i]&&edge[x][i]+y+b[x][i]+a[x][i]-res<d[tt])
{
d[tt]=edge[x][i]+y+b[x][i]+a[x][i]-res;
if(!vis[tt])q.push((Node){tt,d[tt]});
}
}
}
}
}
int main()
{
while(scanf("%d%d%d%d",&n,&m,&s,&t)!=EOF)
{
memset(vis,0,sizeof(vis));
memset(d,0x3f,sizeof(d));
for(int i=1;i<=n;i++)
{
ver[i].clear();edge[i].clear();
a[i].clear();b[i].clear();
}
for(int i=1;i<=m;i++)
{
int x1=read(),x2=read(),x4=read(),x5=read(),x3=read();
if(x3>x4)continue;
ver[x1].push_back(x2);
edge[x1].push_back(x3);
a[x1].push_back(x4);
b[x1].push_back(x5);
}
//cout<<d[t]<<endl;
dijkstra();
printf("Case %d: %d\n",++T,d[t]);
}
return 0;
}

洛谷 题解 UVA12661 【有趣的赛车比赛 Funny Car Racing】的更多相关文章

  1. 【洛谷 P2226】 [HNOI2001]遥控赛车比赛(最短路)

    题目链接 首先拆点,把每个点拆成4个点,表示到达这个点的时候赛车的朝向. 然后考虑连边. 相邻同向并且都是可以走的点直接连边权1的边. 至于怎么转向,只需在每个点\(i\)向每个方向一直拓展直到不能走 ...

  2. 洛谷 P5595 【XR-4】歌唱比赛

    洛谷 P5595 [XR-4]歌唱比赛 题目传送门 题目描述 小 X 参加了一场歌唱比赛. 经过一路鏖战,小 X 终于挺进了决赛,他的对手是小 Y. 这场歌唱比赛的冠军是由点赞数决定的,谁的点赞数高, ...

  3. 【题解】洛谷P3200 [HNOI2009] 有趣的数列(卡特兰数+质因数分解)

    洛谷P3200:https://www.luogu.org/problemnew/show/P3200 思路 这题明显是卡特兰数的题型咯 一看精度有点大 如果递推卡特兰数公式要到O(n2) 可以证明得 ...

  4. 洛谷 题解 P1600 【天天爱跑步】 (NOIP2016)

    必须得说,这是一道难题(尤其对于我这样普及组205分的蒟蒻) 提交结果(NOIP2016 天天爱跑步): OJ名 编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间 Libre ...

  5. 洛谷 题解 UVA572 【油田 Oil Deposits】

    这是我在洛谷上的第一篇题解!!!!!!!! 这个其实很简单的 我是一只卡在了结束条件这里所以一直听取WA声一片,详细解释代码里见 #include<iostream> #include&l ...

  6. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  7. 洛谷【P2022 有趣的数】 题解

    题目链接 https://www.luogu.org/problem/P2022 题目描述 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10 ...

  8. 洛谷 题解 P5595 【【XR-4】歌唱比赛】

    本蒟蒻又双叒叕被爆踩了. 考试时一遍过 其实这题还是很简单的,难度不会大于普及组T1. CSP 2019 RP++ 看开始看到题目,觉得特别长,不想看... 我来和你们分析分析题目,你们就都可以秒了. ...

  9. 洛谷题解 CF777A 【Shell Game】

    同步题解 题目翻译(可能有童鞋没读懂题面上的翻译) 给你三张牌0,1,2. 最初选一张,然后依次进行n次交换,交换规则为:中间一张和左边的一张,中间一张和右边一张,中间一张和左边一张...... 最后 ...

随机推荐

  1. golang-笔记1

    指针: 指针就是地址. 指针变量就是存储地址的变量. *p : 解引用.间接引用. 栈帧: 用来给函数运行提供内存空间. 取内存于 stack 上. 当函数调用时,产生栈帧.函数调用结束,释放栈帧. ...

  2. Ruby on Rails框架(1)-安装全攻略

    序 关于Rails的三句箴言 (1)DRY:Don't Repeat Yourself(不要重复你自己) rails的开发理念,不要用你的代码不停的重复,rails框架给开发者提供了一套非常完善的支持 ...

  3. Hadoop 压缩

    压缩的好处 文件压缩的好处:减少文件存储锁需要的磁盘空间,加速数据在网络和磁盘上的传输. 常见的压缩格式 压缩格式 工具 算法 文件扩展名 是否可以切分 DELATE 无 DEFLATE     .d ...

  4. mint-ui 做省市选择组件

    省市的数据是动态的,其实不是动态的更好搞 <!-- 省市选择 --> <mt-popup v-model="popupVisible" position=&quo ...

  5. Jmeter聚合报告理解

     Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值 Samples:表示这次测试中一共发出了多少个请求 ...

  6. Python flask模块接口开发学习总结

    引言 Flask 是一个简单且十分强大的Python web 框架.它被称为微框架,“微”并不是意味着把整个Web应用放入到一个Python文件,微框架中的“微”是指Flask旨在保持代码简洁且易于扩 ...

  7. Oracle数据库使用出现错误-状态: 失败 ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist

    Oracle数据库使用出现错误-状态: 失败 ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist ...

  8. python gtk 环境

    为Python添加GTK+库:pygtk(windows下安装pygtk) 一.下载需要的文件 昨天晚上就是所需的文件没有找全,我还以为只需要一个pygtk就够了. 1.下载pygtk需要的文件 到p ...

  9. Apollo简介及项目集成

    1. 产生背景 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关.参数的配置.服务器的地址…… 对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境.分集群管理配置,完善的权限 ...

  10. TCP为什么会出现 RST

    就目前遇到的情况而言,都是负载设备,或健康检查设备发送的. 为什么会出现 RST 因为具有周期性,我大概猜到了,是 lvs 对我的后端服务的健康检查导致的,联系了网络运营服务客服人员,我把.pcap给 ...