很简单的一道最短路问题。分情况处理赛道的打开和关闭。

Code

 /**
* UVa
* Problem#12661
* Accepted
* Time:50ms
*/
#include<iostream>
#include<fstream>
#include<sstream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cctype>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<vector>
using namespace std;
typedef bool boolean;
#define smin(a, b) (a) = min((a), (b))
#define smax(as, b) (a) = max((a), (b))
template<typename T>
inline boolean readInteger(T& u){
char x;
int aFlag = ;
while(!isdigit((x = getchar())) && x != '-' && x != -);
if(x == -) return false;
if(x == '-'){
x = getchar();
aFlag = -;
}
for(u = x - ''; isdigit((x = getchar())); u = (u << ) + (u << ) + x - '');
ungetc(x, stdin);
u *= aFlag;
return true;
} typedef class Edge{
public:
int end;
int next;
int open;
int close;
int t;
Edge(const int end = , const int next = , const int open = , const int close = , const int t = ):end(end), next(next), open(open), close(close), t(t){ }
int across(int arrived){
int re = arrived % (open + close);
if(re >= && re + t <= open) return arrived + t;
return (arrived / (open + close) + ) * (open + close) + t;
}
}Edge; typedef class MapManager{
public:
int ce;
Edge* edges;
int* h;
MapManager():ce(), edges(NULL), h(NULL){ }
MapManager(int points, int limit):ce(){
h = new int[(const int)(points + )];
edges = new Edge[(const int)(limit + )];
memset(h, , sizeof(int) * (points + ));
}
inline void addEdge(int from, int end, int open, int close, int t){
if(t > open) return; //无法通过
edges[++ce] = Edge(end, h[from], open, close, t);
h[from] = ce;
}
Edge& operator [](int pos){
return edges[pos];
}
void clear(){
delete[] edges;
delete[] h;
ce = ;
}
}MapManager; #define m_begin(g, i) (g).h[(i)] int n, m, from, _end;
MapManager g; inline boolean init(){
if(!readInteger(n)) return false;
readInteger(m);
readInteger(from);
readInteger(_end);
g = MapManager(n, m);
for(int i = , u, v, a, b, t; i <= m; i++){
readInteger(u);
readInteger(v);
readInteger(a);
readInteger(b);
readInteger(t);
g.addEdge(u, v, a, b, t);
}
return true;
} boolean* visited;
queue<int> que;
int* f;
inline int spfa(int s, int t){
que.push(s);
visited[s] = true;
f[s] = ;
while(!que.empty()){
int e = que.front();
que.pop();
visited[e] = false;
for(int i = m_begin(g, e); i != ; i = g[i].next){
int& eu = g[i].end;
int cmp = g[i].across(f[e]);
if(cmp < f[eu]){
f[eu] = cmp;
if(!visited[eu] && eu != t){
que.push(eu);
visited[eu] = true;
}
}
}
}
return f[t];
} inline void solve(){
visited = new boolean[(const int)(n + )];
f = new int[(const int)(n + )];
memset(visited, false, sizeof(boolean) * (n + ));
memset(f, 0x7f, sizeof(int) * (n + ));
int res = spfa(from, _end);
printf("%d\n", res);
} inline void clear(){
g.clear();
delete[] visited;
delete[] f;
} int main(){
int kase = ;
while(init()){
printf("Case %d: ", kase++);
solve();
clear();
}
return ;
}

UVa 12661 Funny Car Racing - spfa的更多相关文章

  1. UVa - 12661 - Funny Car Racing

    先上题目: 12661 Funny Car RacingThere is a funny car racing in a city with n junctions and m directed ro ...

  2. UVa 12661 - Funny Car Racing(Dijkstra)

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

  3. UVA 12661 Funny Car Racing 有趣的赛车比赛(最短路,变形)

    题意:赛道有n个交叉点,和m条单向路径(有重边),每条路都是周期性关闭的,且通过仍需一段时间.在比赛开始时,所有道路刚好打开,选择进入该道路必须满足“在打开的时间段进入,在关闭之前出来”,即不可在路上 ...

  4. UVa 12661 Funny Car Racing (dijkstra)

    题意:给定一个有向图,每条路有5个整数修饰,u, v, a, b, t,表示起点为u,终点为v,打开时间a,关闭时间为b,通过时间为t,打开关闭是交替进行的, 问你从s到t最短时间是多少. 析:使用d ...

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

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

  6. UVa 12661 Funny Car Racing【 dijkstra 】

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

  7. UVa 12661 (单源最短路) Funny Car Racing

    题意: 有一个赛车跑道,可以看做一个加权有向图.每个跑道(有向边)还有一个特点就是,会周期性地打开a秒,然后关闭b秒.只有在赛车进入一直到出来,该跑道一直处于打开状态,赛车才能通过. 开始时所有跑道处 ...

  8. UVA 11090 Going in Cycle!! SPFA判断负环+二分

    原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  9. UVA 11280 - Flying to Fredericton SPFA变形

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&c ...

随机推荐

  1. 【python基础】字符串格式化(% VS format)

    字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存. 1.百分号方式 ...

  2. requests库的post请求

    requests库的post请求 #coding:utf-8 import requests import json class Trans(object): def __init__(self, w ...

  3. 前端 HTML 常用标签 head标签相关内容

    HTML常用标签 head标签 我们首先来介绍一下head标签的主要内容和作用,文档的头部描述了文档的各种属性和信息,包括文档的标题.编码方式及URL等信息,这些信息大部分是用于提供索引,辩认或其他方 ...

  4. Ubuntu Kylin 14.04 安装配置 jdk、eclipse、tomcat 通用

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq1053781225/article/details/24810107 一.安装jdk       ...

  5. js-jquery-Validate校验【二】中文api

    jQuery.validate 中文 API 名称 返回类型 描述 validate(options) Validator 验证所选的 FORM. valid() Boolean 检查是否验证通过. ...

  6. transition使用

  7. ubuntu 安装ftp,配置,和java调用

    1:安装 ftp服务器 sudo apt-get install vsftpd 自动安装使用的是主机的用户名和密码:liyafei,1367xxx 访问方式,ftp://localhost:21,ft ...

  8. Andrew Ng-ML-第十七章-推荐系统

    1.问题规划  图1.推荐系统在研究什么? 例子:预测电影的评分. 当知道n_u用户数,n_m电影数:r(i,j)用户j评价了电影i,那么就是1:y(i,j)如果r(i,j)为1,那么就给出评分. 问 ...

  9. [LeetCode] 256. Paint House_Easy tag: Dynamic Programming

    There are a row of n houses, each house can be painted with one of the three colors: red, blue or gr ...

  10. .net MVC 下拉多级联动及编辑

    多级联动实现,附源码.当前,部分代码是参与博客园其它网友. 新增,前台代码: <script src="~/Scripts/jquery-1.10.2.js">< ...