翻译:

Dingiville 城市的交通规则非常奇怪,城市公路通过路口相连,两个不同路口之间最多只有一条直达公路。公路的起止点不会是同一路口。
在任意一条公路上顺不同方向走所需时间相同。
每一个路口都有交通灯,这些交通灯在某一时刻要么是蓝色,要么是紫色。
同一个灯上2个颜色的维持时间受到定期调控,总是蓝色持续一段时间,紫色持续一段时间。
交通规则规定两个路口可以通车仅当公路两边交通灯的颜色相同(也就是说只要你在A城市看见A与B的交通灯颜色相同,那么你就可以走上A-B 这条路并到达B点)。
交通工具可以在路口等候。现在你有这个城市的地图,包含:

1 通过所有公路需要的时间(整数)
2 每个路口交通灯两种颜色的持续时间(整数)
3 每个路口交通灯的初始颜色以及初始颜色的持续时间(整数).
你的任务是找到一条从起点到终点的最快路径,当有多条这样的路径存在时,你只需输出任意一条即可。

分析:
最短路

#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;#define inc(x) (x = (x+1) % MOD)const int maxn = 306;
const int maxm = 28006;
const int MOD = maxm;
const int oo = 0x3f3f3f3f;
inline int read()
{int x = 0, f = 1, t = getchar();while(t < '0' || t > '9') {if(t == '-') f = -1;t = getchar();}while(t >= '0' && t <= '9') {x = (x << 1) + (x << 3) + t - '0';t = getchar();}return x * f;
}
inline int min(int a, int b) { return a < b ? a : b; }struct Edge
{int u, v, w;Edge(int u = 0, int v = 0, int w = 0): u(u), v(v), w(w) {}
};int n, m, s, t;
int C[maxn], R[maxn], T[maxn][2], S[maxn];
int head[maxn];
int next[maxm];
Edge edge[maxm];
int fa[maxn];void addedge(int a, int b, int c)
{edge[++m] = Edge(a, b, c);next[m] = head[a], head[a] = m;
}
void init()
{memset(head, -1, sizeof(head));s = read(), t = read(), n = read();int mm = read(), a, b, c;for(int i = 1; i <= n; ++i) {C[i] = (getchar() == 'B' ? 0 : 1);R[i] = read(), T[i][0] = read(), T[i][1] = read();S[i] = T[i][0] + T[i][1];}for(int i = 1; i <= mm; ++i) {a = read(), b = read(), c = read();addedge(a, b, c);addedge(b, a, c);}
}
int color(int u, int t, int &r)
{if(t < R[u]) {r = R[u] - t;return C[u];}t = (t - R[u]) % S[u];if(t >= T[u][C[u]^1]) {r = S[u] - t;return C[u];}else {r = T[u][C[u]^1] - t;return C[u]^1;}
}
int calc(int u, int v, int t)
{int ru, rv, cu = color(u, t, ru), cv = color(v, t, rv);if(cu == cv) return 0;if(ru != rv) return min(ru, rv);if(T[u][!cu] != T[v][!cv])return ru + min(T[u][!cu], T[v][!cv]);return oo;
}
int spfa()
{static int que[maxm] = {s}, h = 0, r = 1;static int dis[maxn], inq[maxn] = {0};memset(dis, oo, sizeof(dis)), dis[s] = 0;while(h != r) {int x = que[h];inc(h);inq[x] = 0;for(int i = head[x]; i != -1; i = next[i]) {Edge &e = edge[i];int cost = calc(x, e.v, dis[x]);if(cost == oo) continue;if(dis[e.v] > dis[x] + e.w + cost) {dis[e.v] = dis[x] + e.w + cost;fa[e.v] = x;if(!inq[e.v]) {que[r] = e.v;inq[e.v] = 1;inc(r);}}}}return dis[t];
}
void work()
{static int stack[maxn] = {0}, top = 0;int ans = spfa();if(ans < oo) {printf("%d\n", ans);for(int x = t; x != s; x = fa[x])stack[top++] = x;printf("%d", s);while(top--) printf(" %d", stack[top]);}else puts("0");
}
int main()
{#ifndef ONLINE_JUDGEfreopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);#endifinit();work();#ifndef ONLINE_JUDGEfclose(stdin);fclose(stdout);#endifreturn 0;
}

sgu103: Traffic Lights相关推荐

  1. SGU103 Traffic Lights

    题目大意: 一个城市的交通系统可以由一些节点和道路来表示.两个节点之间最多存在一条道路,且不存在道路起点与终点相同.每一条道路都是双向的.在每一个节点由一个交通信号灯,它只有蓝色和紫色两种颜色,并且周 ...

  2. CodeForces刷题C语言:Next Test、Spit Problem、Traffic Lights、Reconnaissance、Borze

    记录洛谷刷题C语言 一.Next Test 题面翻译 题面描述 给出 nnn 个互不相同的整数 aia_iai​ ,从小到大找第一个没有出现过的整数. 输入格式 第一行一个正整数 nnn ,之后是 n ...

  3. Traffic Lights(翻译)

    来源:https://codeforces.com/contest/29/problem/B Traffic Lights A car moves from point A to point B at ...

  4. 【SGU】103. Traffic Lights 最短路

    传送门:[SGU]103. Traffic Lights 题目大意: 在一个N个点M条边的城市里,每个点上有一个交通灯,交通灯亮B.P颜色,在离开始r的时间内交通灯会亮c颜色(c为B.P中的一种),然 ...

  5. signature=23e9377f593aff2d118917dcf0d9f6d0,Turning streams in the traffic lights system

    摘要: Observations of a currently functioning in Poland traffic lights system shows a need for it's mo ...

  6. SGU103 The traffic lights 绞脑题

    题意:一张有向图,给出起点和终点.每个点有个交通灯,可能是蓝色或紫色(什么鬼..).每个点的蓝色和紫色各有一个持续时间(每个点的交通灯数据不一定相同),并且有一个0时刻的初始颜色以及初始颜色剩余的持续 ...

  7. SGU 103 Traffic Lights (最短路)

    题意:http://www.cnblogs.com/yylogo/archive/2011/06/05/SGU-103.html 分析:比通常的最短路问题多了个限制条件,即每个路口的颜色必须相同时才能 ...

  8. SGU 103 Traffic Lights 翻译 题解

    103. 交通灯 每个测试点:0.5s 内存限制:4096KB 在Dingilville市城市交通的安排很不寻常,公路连接着路口,在两个不同的路口之间最多有一条公路连接,没有公路会连接一个路口自身.正 ...

  9. 29 B. Traffic Lights

    题目: 求车通过红绿灯的时间 题解: 若车过d时是绿灯,时间是总路程/速度 若车过d时是红灯,时间是总路程/速度+等红灯时间 代码: #include<iostream> #include ...

最新文章

  1. [JavaScript]走进 JAVASCRIPT 黑洞
  2. 从奥运订票系统说起——谈FastCGI 与IT 架构
  3. 用openMP进行并行加速
  4. 关于 Java 中 finally 语句块的深度辨析
  5. Yii框架特点及测试考虑
  6. 当程序开发人员开始抛弃技术时,是否意味着噩梦的开始?抛弃了SQL Server 2000才发现客户的简单问题真的很难解决...
  7. SAP UI5 应用开发教程之十九 - SAP UI5 数据类型和复杂的数据绑定
  8. SQL语言基础:常用的数据查询语句
  9. python基础技巧总结(一)
  10. java求平均值Scanner_Scanner的一些问题
  11. python 线性规划问题_一学高数,线代就头疼?让python帮你解决(内含教程)
  12. python中的order_Hive中Order by和Sort by的区别是什么?
  13. 黑盒测试 ------ 等价类划分法
  14. powershell文章汇总
  15. matlab如何求空间一点到直线距离,空间点到直线距离怎么求
  16. 加拿大高中课程计算机科学,加拿大高中课程
  17. 透视星环科技上市:基础工具、技术融合、场景应用三维击穿
  18. antd系列之Select
  19. 树莓派开始,玩转Linux21:进程的生与死
  20. 人机交互新突破:百度发布主动多模态交互技术

热门文章

  1. 色弱能学计算机美工吗,通过哪些检查可以确定是不是色盲或者色弱
  2. Google怎么开启标签页同步功能
  3. C# 之 比较两个word文档的内容
  4. java pdf转word,没页数限制,去除水印
  5. matlab adams 机械臂,基于ADAMS与MATLAB/SIMULINK的二杆机械臂动力学仿真与验证
  6. iOS 关于时区转化问题
  7. 羊了个羊微信小程序实现
  8. H264编码 GOP组 以及 I帧 B帧 P帧 说明
  9. 工商银行银企直联开发java,工商银行银企互联WebService中间件
  10. 卸载后以前拍的视频会删除吗_95后不倒翁小姐姐:5天涨粉100万,带火一座长安城!...