洛谷 题解 UVA12661 【有趣的赛车比赛 Funny Car Racing】
【题意】
在一个赛车比赛中,赛道有\(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】的更多相关文章
- 【洛谷 P2226】 [HNOI2001]遥控赛车比赛(最短路)
题目链接 首先拆点,把每个点拆成4个点,表示到达这个点的时候赛车的朝向. 然后考虑连边. 相邻同向并且都是可以走的点直接连边权1的边. 至于怎么转向,只需在每个点\(i\)向每个方向一直拓展直到不能走 ...
- 洛谷 P5595 【XR-4】歌唱比赛
洛谷 P5595 [XR-4]歌唱比赛 题目传送门 题目描述 小 X 参加了一场歌唱比赛. 经过一路鏖战,小 X 终于挺进了决赛,他的对手是小 Y. 这场歌唱比赛的冠军是由点赞数决定的,谁的点赞数高, ...
- 【题解】洛谷P3200 [HNOI2009] 有趣的数列(卡特兰数+质因数分解)
洛谷P3200:https://www.luogu.org/problemnew/show/P3200 思路 这题明显是卡特兰数的题型咯 一看精度有点大 如果递推卡特兰数公式要到O(n2) 可以证明得 ...
- 洛谷 题解 P1600 【天天爱跑步】 (NOIP2016)
必须得说,这是一道难题(尤其对于我这样普及组205分的蒟蒻) 提交结果(NOIP2016 天天爱跑步): OJ名 编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间 Libre ...
- 洛谷 题解 UVA572 【油田 Oil Deposits】
这是我在洛谷上的第一篇题解!!!!!!!! 这个其实很简单的 我是一只卡在了结束条件这里所以一直听取WA声一片,详细解释代码里见 #include<iostream> #include&l ...
- 洛谷题解P4314CPU监控--线段树
题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...
- 洛谷【P2022 有趣的数】 题解
题目链接 https://www.luogu.org/problem/P2022 题目描述 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10 ...
- 洛谷 题解 P5595 【【XR-4】歌唱比赛】
本蒟蒻又双叒叕被爆踩了. 考试时一遍过 其实这题还是很简单的,难度不会大于普及组T1. CSP 2019 RP++ 看开始看到题目,觉得特别长,不想看... 我来和你们分析分析题目,你们就都可以秒了. ...
- 洛谷题解 CF777A 【Shell Game】
同步题解 题目翻译(可能有童鞋没读懂题面上的翻译) 给你三张牌0,1,2. 最初选一张,然后依次进行n次交换,交换规则为:中间一张和左边的一张,中间一张和右边一张,中间一张和左边一张...... 最后 ...
随机推荐
- hbase 在线修复集群命令
前提:HDFS fsck确保hbase根目录下文件没有损坏丢失,如果有,则先进行corrupt block移除. 切记:一定要在所有Region都上线之后再修复,否则修复之后可能出现重复Region. ...
- CFD计算过程发散诸多原因分析【转载】
转载自: http://blog.sina.com.cn/s/blog_5fdfa7e601010rkx.html 今天探讨引起CFD计算过程中发散的一些原因.cfd计算是将描述物理问题的偏微分方程转 ...
- Prometheus基础(二)
1.什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开发,是Google BorgMon监控 ...
- ubuntu之路——day7.1 衡量模型好坏的因素偏差和方差bias&variance 以及在深度学习中的模型优化思路
Error | 误差 Bias | 偏差 – 衡量准确性 Variance | 方差 – 衡量稳定性 首先我们通常在实际操作中会直接用错误率或者与之对应的准确率来衡量一个模型的好坏,但是更加准确的做法 ...
- Git是怎么Ignore文件的?
Git is one of the most popular version control systems (VCS) available, especially thanks to hosting ...
- <深度学习优化策略-3> 深度学习网络加速器Weight Normalization_WN
前面我们学习过深度学习中用于加速网络训练.提升网络泛化能力的两种策略:Batch Normalization(Batch Normalization)和Layer Normalization(LN). ...
- html5中progress/meter元素
html5中progress/meter元素 一.总结 一句话总结: progress元素:用来建立一个进度条 meter元素的作用:用来建立一个度量条,用来表示度量衡的评定 <progress ...
- cv2.imread()
cv2.imread() 使用opencv和caffe的伙伴们,可能会有一个疑问,那就是对于同时读取图片的cv2.imread()和caffe.io.loadimage两个函数,有什么差别? 1.cv ...
- Js-事件分发与DOM事件流
原文地址:https://www.jianshu.com/p/dc1520327022 Js事件分发与DOM事件流 对JavaScript分发事件不熟悉,网上查阅相关资料整理后,记录一下对Javasc ...
- Tosca:设置执行结束时间