【题意】

在一个赛车比赛中,赛道有\(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. day25 内置常用模块(四): 模块和包

    阅读目录: 模块 import from xxx import xxx 包 import from xxx import xxx    from xxx  import *    __init__.p ...

  2. 如何手动安装WordPress主题和插件(Linux)

    1. 去官网找到你想使用的插件或主题,并复制下载地址 2. cd到WordPress网站目录下的插件或主题目录下 这里以我的为例: 安装插件:cd /var/www/html/wp-content/p ...

  3. 部署Django到云服务器(centos+nginx+mysql+uwsgi+python3)【操作篇(1)】

    开篇 笛卡尔说:"你不能教会一个人任何东西,你只能帮助他发现他自己内心本来就有的东西!" jacky能教你的,只能是经验和建议,要逆袭还得通过自己对数据的不断领悟,数据领域的技能都 ...

  4. 【知识点】Java机密

    Java添加PDF图章.动态图章 主要实现以下功能: 添加图片图章.即通过加载现有的图章(以图片形式),添加到PDF指定页面位置 添加动态图章.即加载PDF文档,并在动态的添加印章内容,包括印章字样. ...

  5. [Shell]利用JS文件反弹Shell

    0x01 模拟环境 攻击: kali ip: 192.168.248.132 测试: windows 7 x64 ip: 192.168.248.136 0x02 工具地址 https://githu ...

  6. mysql5.6源码部署

    一.准备环境 环境:centos-7.3 一台软件版本:mysql-5.6.39 1.安装依赖yum -y install autoconf libaio bison ncurses-devel 2. ...

  7. pymongo错误记录

    1.AutoReconnect pymongo.errors.AutoReconnect: connection closed 2.ServerSelectionTimeoutError pymong ...

  8. 在 delphi (Object Pascal 语言)中,使用 array 关键字进行数组定义。

    如果需要定义二维数组可以采取以下定义形式: 一.静态数组定义 静态数组定义,通常用于数组元素的数目确定的情况.定义形式如下: 示例: 1 2 3 4 5 6 7 8 9 10 11 type   // ...

  9. js 对象 toJSON 方法

    浅谈 js 对象 toJSON 方法   前些天在<浅谈 JSON.stringify 方法>说了他的正确使用姿势,今天来说下 toJSON 方法吧.其实我觉得这货跟 toString 一 ...

  10. Ubuntu 1604 安装配置 kafka,并配置开机自启(systemctl)

    安装 kafka 需要先安装 jdk.一.下载官网:http://kafka.apache.org/downloads.html 二.安装 安装参考:https://segmentfault.com/ ...