链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4399

题意:

在一个赛车比赛中,赛道有n(n≤300)个路口和m(m≤50000)条单向道路。有趣的是:每条路都是周期性关闭的。
每条路用5个整数u, v, a, b, t表示(1≤u,v≤n,1≤a,b,t≤1e5),表示起点是u,终点是v,通过时间为t秒。
另外,这条路会打开a秒,然后关闭b秒,然后再打开a秒,依此类推。当比赛开始时,每条道路刚刚打开。
你的赛车必须在道路打开的时候进入该道路,并且在它关闭之前离开(可以在打开的瞬间进入,关闭的瞬间离开)。
注意你的赛车可以在道路关闭的时候在路口等待它打开。没有道路连接同一个路口,但一对路口之间可能有多条道路。
你的任务是从s出发,尽早到达目的地t(1≤s,t≤n)。

分析:

本题是一道最短路问题,但又和普通的最短路问题不太相同:花费的总时间并不是经过的每条边的通过时间之和,
还要加上在每个点等待的总时间。仍然调用标准的Dijkstra算法,
只是在计算一个结点u出发的边权时要考虑d[u](即从s出发达到u的最早时刻)。计算边权时分情况讨论一下即可。

代码:

 #include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std; struct Edge {
int b, open, close, time;
};
struct HeapNode {
int ver, dist;
bool operator < (const HeapNode& that) const {
return dist > that.dist;
}
};
const int INF = 0x3f3f3f3f;
const int UP = + ;
int d[UP];
bool done[UP];
vector<Edge> edge[UP]; int Dijkstra(int start, int finish) {
memset(d, INF, sizeof(d));
memset(done, false, sizeof(done));
d[start] = ;
priority_queue<HeapNode> Q;
Q.push((HeapNode){start, });
while(!Q.empty()) {
HeapNode f = Q.top(); Q.pop();
int ver = f.ver;
if(ver == finish) return f.dist;
if(done[ver]) continue;
done[ver] = true;
for(int i = ; i < edge[ver].size(); i++) {
Edge& b = edge[ver][i];
int progress = d[ver] % (b.open + b.close);
if(progress + b.time <= b.open) {
if(d[b.b] > d[ver] + b.time) {
d[b.b] = d[ver] + b.time;
Q.push((HeapNode){b.b, d[b.b]});
}
} else {
int need = d[ver] + b.time + b.open + b.close - progress;
if(d[b.b] > need) {
d[b.b] = need;
Q.push((HeapNode){b.b, need});
}
}
}
}
return d[finish];
} int main() {
int n, m, start, finish;
for(int cases = ; ~scanf("%d%d%d%d", &n, &m, &start, &finish); cases++) {
for(int i = ; i <= n; i++) edge[i].clear();
for(int L, R, a, b, t, i = ; i < m; i++) {
scanf("%d%d%d%d%d", &L, &R, &a, &b, &t);
if(t > a) continue;
edge[L].push_back((Edge){R, a, b, t});
}
printf("Case %d: %d\n", cases, Dijkstra(start, finish));
}
return ;
}

UVa 12661 - Funny Car Racing(Dijkstra)的更多相关文章

  1. UVA - 12661 Funny Car Racing (Dijkstra算法)

    题目: 思路: 把时间当做距离利用Dijkstra算法来做这个题. 前提:该结点e.c<=e.a,k = d[v]%(e.a+e.b); 当车在这个点的1处时,如果在第一个a这段时间内能够通过且 ...

  2. UVA-12661 Funny Car Racing (dijkstra)

    题目大意:一张有向图,问从起点到终点的最快时间.不过边有点特殊,从u到v的边没开放a秒就关闭b秒. 题目分析:dijkstra算法即可.在从u走到v的时候要注意一下时间. 代码如下: # includ ...

  3. UVa 12661 Funny Car Racing【 dijkstra 】

    题意:给出n个点,m条路,每条路用5个整数表示u,v,a,b,t u表示这条路的起点,v表示终点,a表示打开时间,b表示关闭时间,t表示通过这条道路需要的时间 看的紫书,因为边权不再仅仅是路上的时间, ...

  4. 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)

    迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...

  5. 最短路径之迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...

  6. 理解最短路径——迪杰斯特拉(dijkstra)算法

    原址地址:http://ibupu.link/?id=29 1.       迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科 ...

  7. uva 1153 顾客是上帝(贪心)

    uva 1153 顾客是上帝(贪心) 有n个工作,已知每个工作需要的时间q[i]和截止时间d[i](必须在此前完成),最多能完成多少个工作?工作只能串行完成,第一项任务开始的时间不早于时刻0. 这道题 ...

  8. 图论——迪杰斯特拉算法(Dijkstra)实现,leetcode

    迪杰斯特拉算法(Dijkstra):求一点到另外一点的最短距离 两种实现方法: 邻接矩阵,时间复杂度O(n^2) 邻接表+优先队列,时间复杂度O(mlogn)(适用于稀疏图) (n:图的节点数,m:图 ...

  9. 算法-迪杰斯特拉算法(dijkstra)-最短路径

    迪杰斯特拉算法(dijkstra)-最短路径 简介: 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中 ...

随机推荐

  1. 通过POST请求上传文件

    转自:https://blog.csdn.net/zhangge3663/article/details/81218488 理论 简单的HTTP POST 大家通过HTTP向服务器发送POST请求提交 ...

  2. TCP/IP提供网络传输速率

    丢包(超时)->减少超时时间->ECN(有网络设备通知终端,有丢包发生)->DCTCP(优化快恢复) 丢包是超时的充分条件,但不是必要条件,因此也可通过其他方式获得丢包是否发生,比如 ...

  3. SQL SERVER学习2——数据库设计

    数据库设计是数据库知识中比较重要的部分,我们需要了解数据库设计的基本步骤,E-R图的画法. 数据库设计的基本概述 检验一个数据库设计好坏的标准就是,看他是否能够方便的执行各种数据检索和处理操作,并且有 ...

  4. golang学习之接口型函数

    先说下使用接口型函数的好处: 1.不必将某个接口函数附在某个type上面,保证了命名随意 2. 可以直接调用函数或者使用该接口,两两不耽误 直接上代码吧: // interface_func proj ...

  5. php中模糊查询并关联三个select框

    1.在php中我们经常用到下拉框,并相互关联,如果下拉框的option非常多,那么我们就要用到模糊搜索功能,那么怎么做呢? 在此功能中,走了弯路,最好不要关联两个select的id值后select属性 ...

  6. 循环遍历正则验证input框内容合法性

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. python学习之老男孩python全栈第九期_day017知识点总结——初识递归、算法

    一. 递归函数 如果一个函数在内部调用自身本身,这个函数就是递归函数. 最大递归深度默认是997 -- python从内存角度出发做得限制(而不是程序真的报错),最大深度可以修改 def func(n ...

  8. 基于jQuery的数字键盘插件

    有时,我们需要在网页上使用软键盘.今天,就给大家带来一个基于jQuery的数字键盘插件,除了jQuery,不需要依赖任何文件资源.纯数字键盘,有退格,有清除,不支持输入小数(需要的可以自己改一下,主要 ...

  9. Berlekamp-Massey算法

    \(BM\) 算法 用处 它可以用来求常系数线性递推的系数,并且可以求出最短的 求出来有什么用呢? 你可以闷声Cayley-Hamilton定理优化递推矩阵快速幂 算法简介 首先设一个数列 \(f\) ...

  10. C# 读取excel用户列表过滤一个月内未收到外部邮件已离职的员工

    1.通过aspose.cells读取excel中的数据并添加到list中 //存储从excel中读取出来的数据 List<UserInfo> lst_userinfo = new List ...