UVa 12661 Funny Car Racing - spfa
很简单的一道最短路问题。分情况处理赛道的打开和关闭。
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的更多相关文章
- UVa - 12661 - Funny Car Racing
先上题目: 12661 Funny Car RacingThere is a funny car racing in a city with n junctions and m directed ro ...
- UVa 12661 - Funny Car Racing(Dijkstra)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 12661 Funny Car Racing 有趣的赛车比赛(最短路,变形)
题意:赛道有n个交叉点,和m条单向路径(有重边),每条路都是周期性关闭的,且通过仍需一段时间.在比赛开始时,所有道路刚好打开,选择进入该道路必须满足“在打开的时间段进入,在关闭之前出来”,即不可在路上 ...
- UVa 12661 Funny Car Racing (dijkstra)
题意:给定一个有向图,每条路有5个整数修饰,u, v, a, b, t,表示起点为u,终点为v,打开时间a,关闭时间为b,通过时间为t,打开关闭是交替进行的, 问你从s到t最短时间是多少. 析:使用d ...
- UVA - 12661 Funny Car Racing (Dijkstra算法)
题目: 思路: 把时间当做距离利用Dijkstra算法来做这个题. 前提:该结点e.c<=e.a,k = d[v]%(e.a+e.b); 当车在这个点的1处时,如果在第一个a这段时间内能够通过且 ...
- UVa 12661 Funny Car Racing【 dijkstra 】
题意:给出n个点,m条路,每条路用5个整数表示u,v,a,b,t u表示这条路的起点,v表示终点,a表示打开时间,b表示关闭时间,t表示通过这条道路需要的时间 看的紫书,因为边权不再仅仅是路上的时间, ...
- UVa 12661 (单源最短路) Funny Car Racing
题意: 有一个赛车跑道,可以看做一个加权有向图.每个跑道(有向边)还有一个特点就是,会周期性地打开a秒,然后关闭b秒.只有在赛车进入一直到出来,该跑道一直处于打开状态,赛车才能通过. 开始时所有跑道处 ...
- UVA 11090 Going in Cycle!! SPFA判断负环+二分
原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA 11280 - Flying to Fredericton SPFA变形
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&c ...
随机推荐
- CCCC L2-022. 重排链表
题解:直接list模拟,头尾两个指针,分别将头尾元素push到另一个list里面,输处输入方式同上一篇 坑:第一发卡了第二个样例,第二发卡了第4个,莫名其妙,所以把两个代码合起来,然后强行ac了. # ...
- css3的一个小demo(箭头hover变化)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Mybatis插入数据后返回主键id
有时候使用mybatis插入数据后,需要用到记录在数据库中的自增id,可以利用keyProperty来返回,赋值给实体类中的指定字段. 单条记录插入并返回 First, if your databas ...
- linux环境下python的部署
linux系统环境自带python2.6,但有时我们项目使用的版本可能是3.x以上等等,此时我们需要在linux中再安装项目所需的python版本,此时就涉及多版本共存问题了,很多同学在安装多个版本P ...
- CentOS网卡配置大全
持续更新中... 1.配置机器名 2.配置网卡属性 3.问题解决 3.1解决网卡经常需要手动重连问题 vi /etc/sysconfig/network-scripts/ifcfg-ens33 把ON ...
- mysql 权限管理 针对库 授权 db.*
需求 只放行user表 db1库的select权限 mysql> grant select on db1.* to 'mike'@'localhost'; Query OK, rows affe ...
- edgeR使用学习【转载】
转自:http://yangl.net/2016/09/27/edger_usage/ 1.Quick start 2. 利用edgeR分析RNA-seq鉴别差异表达基因: #加载软件包 librar ...
- FPKM\RPKM\TPM学习[转载]
转自:http://www.360doc.com/content/18/0112/02/50153987_721216719.shtml 1.问题提出 在RNA-Seq的分析中,对基因或转录本的rea ...
- MySQL架构简介
- [LeetCode] 190. Reverse Bits_Easy tag: Bit Manipulation
Reverse bits of a given 32 bits unsigned integer. Example: Input: 43261596 Output: 964176192 Explana ...