题目大意:
一个城市的交通系统可以由一些节点和道路来表示。两个节点之间最多存在一条道路,且不存在道路起点与终点相同。每一条道路都是双向的。在每一个节点由一个交通信号灯,它只有蓝色和紫色两种颜色,并且周期性的变换,两种颜色的周期长短可能不同。我们称一条道路可通行当且仅当离开起始节点时这条道路两端节点上的信号灯颜色相同。你可以选择在一个节点停留,求从起点到终点的最小耗时。
一道稍微难一点的最短路问题,题目和预处理比较复杂,核心部分只要稍做更改,即将原来松弛公式:

d[v]=min(d[v],d[u]+W[u][v])((u,v)∈E)

d[v]=min(d[v],d[u]+W[u][v]) ((u,v)\in E)
更改为:

d[v]=min(d[v],d[u]+W[u][v]+wait(d[u],u,v))((u,v)∈E)

d[v]=min(d[v],d[u]+W[u][v]+wait(d[u],u,v)) ((u,v)\in E)
其中wait(t,u,v)表示在时间t出发从u到v还要等多少时间。

代码如下(最短路使用SPFA算法):

/*
ID: Sunshine_cfbsl
LANG: C++
*/
#include<cstdio>
#include<stack>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;const int MAXN = 310, INF = 0x3f3f3f3f, MAXM = 14010;
struct Junction {bool c;int r, tb, tp;bool col(int time) { if(time < r) return c;int tmp = (time - r) % (tb + tp);if(c) return tmp < tb ? 0 : 1;return tmp < tp ? 1 : 0;}int change(int time) {if(time < r) return r - time;int tmp = (time - r) % (tb + tp);if(c) return tmp < tb ? tb - tmp : tb + tp - tmp;return tmp < tp ? tp - tmp : tb + tp - tmp;}
}j[MAXN];
int s, t, n, m, pre[MAXN];
int Begin[MAXN], W[MAXM * 2], Next[MAXM * 2], to[MAXM * 2], d[MAXN], e;int wait(int curt, int a, int b) {if(j[a].col(curt) == j[b].col(curt)) return 0;int t1 = j[a].change(curt), t2 = j[b].change(curt);if(t1 == t2) {if(j[a].change(curt + t1) == j[b].change(curt + t2)) return INF;else return min(t1+j[a].change(curt + t1), t2+j[b].change(curt + t2));}return min(t1, t2);
}void output(int x) {if(pre[x]) output(pre[x]);printf("%d ", x);
}void SPFA() {int i;queue<int> q;q.push(s);for(i = 1; i <= n; i++) d[i] = INF;d[s] = 0;while(!q.empty()) {int v = q.front();q.pop();for(i = Begin[v]; i; i = Next[i]) {int w = wait(d[v], v, to[i]);if(d[to[i]] > d[v] + w + W[i]) {d[to[i]] = d[v] + w + W[i];pre[to[i]] = v;q.push(to[i]);}}}if(d[t] == INF) printf("0\n");else {printf("%d\n", d[t]);output(t);printf("\n");}
}void add(int a, int b, int c) {to[++e] = b;Next[e] = Begin[a];Begin[a] = e;W[e] = c;
}int main() {int i;scanf("%d%d", &s, &t);scanf("%d%d", &n, &m);for(i = 1; i <= n; i++) {char ch;scanf(" %c%d%d%d", &ch, &j[i].r, &j[i].tb, &j[i].tp);j[i].c = (ch == 'P');}for(i = 1; i <= m; i++) {int a, b, c;scanf("%d%d%d", &a, &b, &c);add(a, b, c);add(b, a, c);}SPFA();return 0;
}

SGU103 Traffic Lights相关推荐

  1. sgu103: Traffic Lights

    翻译: Dingiville 城市的交通规则非常奇怪,城市公路通过路口相连,两个不同路口之间最多只有一条直达公路.公路的起止点不会是同一路口. 在任意一条公路上顺不同方向走所需时间相同. 每一个路口都 ...

  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. CentOS 6.3下Strongswan搭建IPSec ***(ipsec.conf配置文件有讲解)
  2. emca 更改监听端口
  3. bean加载时调用@value时会出现空指针异常_SpringMVC全局异常处理机制
  4. python ioctl_ioctl()函数 Unix/Linux
  5. unity ui框架_[教程汇总+持续更新]Unity从入门到入坟——收藏这一篇就够了
  6. OS X Capitan 和 macOS Sierra U盘安装
  7. ACM-ICPC 2018 南京赛区网络预赛Sum,线性筛处理积性函数
  8. paip.c++ qt messagebox用法
  9. VS2010与.NET4系列 13. ASP.NET 4 SEO 改进
  10. 2015 CCPC 这次,我为自己鼓掌
  11. 菜鸟教程学习Java
  12. 闲聊linux中的input设备(4) 她一直默默地在背后支持着你
  13. 国内10大著名珠宝品牌
  14. RBP系统管理之系统用户管理
  15. 安装Matlab R2022a/64位
  16. C# 四舍五入、进一法、舍位(取整,舍去小数,向负无穷舍入)函数
  17. 基于matlab的股票投资,基于matlab的股票估价模型系统.doc
  18. 简述CPU,内存,硬盘,指令之间的关系
  19. 什么CAD编辑器能够将图片转换为CAD
  20. 【ESP32】ESP-Face 人脸检测识别

热门文章

  1. person相关性分析-显著性检验
  2. 当吉卜力动画女主们都变成鱼妖之后……
  3. 嵌入式 常用英文简称解读
  4. 怎么用手机剪辑短视频
  5. 有道云笔记签到(java版)
  6. 汽车转向节加工夹具、汽车制动系统CAD设计、汽车膜片式离合器、汽车前制动器CAD图、汽车驱动桥CAD图、汽车升降机、普通式双柱汽车举升机、汽车起重机、汽车悬架系统、汽车模具…………
  7. Jetbrains系列软件爽翻天插件:颜值皮肤Material Theme UI 和 实时翻译Translation
  8. 信捷PLC C语言伺服插补6轴码垛机器人威纶通触摸屏程序
  9. 总结面试问道的一些面试题(持续更新)
  10. Java程序员系列——程序员必须认识的英文单词(汇总)