这题不错,是一个最短路,但是中间有一个限制条件,就是等待时间

首先先看一下为什么仍然满足最短路

因为最短路肯定是每个结点求出最早到达的时间,那么其实不管有没等待,从队头取出去转移的肯定是最早的时间,仍然满足转移

那么就是等待时间如何去计算的问题

其实就先写一个函数,获得当前的颜色,和到下一个颜色的时间

然后如果颜色相同就不用等

如果颜色不同,到下一个颜色时间又不同,就返回其中小的时间

如果扔相同,就可以往后找4次(因为最多3次就进入循环节了),直到有一个时间不同,否则就是无限交替,这条路永远不能走

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;const int N = 305;
const int M = 30005;
const int INF = 0x3f3f3f3f;int s, t;
int n, m;struct Node {int tp, c, r, t;void read(int tp) {this->tp = tp;scanf("%d%d%d", &c, &r, &t);}
} node[N];struct Edge {int u, v, w;Edge() {}Edge(int u, int v, int w) {this->u = u;this->v = v;this->w = w;}
} edge[M];int head[N], nxt[M], en;void add_edge(int u, int v, int w) {edge[en] = Edge(u, v, w);nxt[en] = head[u];head[u] = en++;
}int d[N], vis[N], p[N];struct State {int u, w;State() {}State(int u, int w) {this->u = u;this->w = w;}bool operator < (const State &c) const {return w > c.w;}
};void print(int u) {if (u == s) {printf("%d", u);return;}print(p[u]);printf(" %d", u);
}void get(int now, Node u, int &ca, int &ta) {int c = u.c, r = u.r, t = u.t, tp = u.tp;if (now < c) {ca = tp;ta = c - now;return;}now -= c; tp = !tp;now %= (r + t);if (tp == 0) {if (now < r) {ca = tp;ta = r - now;return;}now -= r; tp = !tp;ca = tp;ta = t - now;return;} else {if (now < t) {ca = tp;ta = t - now;return;}now -= t; tp = !tp;ca = tp;ta = r - now;return;}
}int cal(int now, int u, int v) {int ca, ta, cb, tb;get(now, node[u], ca, ta);get(now, node[v], cb, tb);if (ca == cb) return 0;if (ta != tb)return min(ta, tb);else {int ans = 0;int flag = 1;for (int i = 0; i < 4; i++) {ca = !ca;cb = !cb;ans += ta;if (ca == 0) ta = node[u].r;else ta = node[u].t;if (cb == 0) tb = node[v].r;else tb = node[v].t;if (ta != tb) {flag = 0;break;}}if (flag) return INF;return ans + min(ta, tb);}
}void solve() {for (int i = 1; i <= n; i++) d[i] = INF;memset(vis, 0, sizeof(vis));priority_queue<State> Q;Q.push(State(s, 0));d[s] = 0;while (!Q.empty()) {State x = Q.top();int u = x.u;if (u == t) break;Q.pop();if (vis[u]) continue;vis[u] = 1;for (int i = head[u]; i + 1; i = nxt[i]) {int v = edge[i].v;int w = edge[i].w;int tmp = cal(x.w, u, v) + x.w + w;if (d[v] > tmp) {d[v] = tmp;p[v] = u;Q.push(State(v, d[v]));}}}if (d[t] == INF) printf("0\n");else {printf("%d\n", d[t]);print(t);printf("\n");}
}int main() {while (~scanf("%d%d", &s, &t)) {en = 0;memset(head, -1, sizeof(head));scanf("%d%d", &n, &m);char s[2];for (int i = 1; i <= n; i++) {scanf("%s", s);node[i].read(s[0] == 'P');}int u, v, w;while (m--) {scanf("%d%d%d", &u, &v, &w);add_edge(u, v, w);add_edge(v, u, w);}solve();}return 0;
}

SGU 103 Traffic Lights(最短路)相关推荐

  1. [SGU 103] Traffic Lights [最短路]

    现在给你一个城市网络,求从某点到某点的最短路.每个点上都有一个红绿灯,仅有红绿两种颜色,按照某个周期切换,尽在边的两个端点的灯同色时,这条边才可走. 直接用最短路算法即可,走某条路径之前要加上的等待灯 ...

  2. SGU 103 Traffic Lights (最短路)

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

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

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

  4. SGU 103 Traffic Lights【最短路】

    题目链接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=16530 题意: 给定每个点最初的颜色,最初颜色持续时间,以 ...

  5. SGU 103 Traffic Lights

    http://acm.sgu.ru/problem.php?contest=0&problem=103 有条件限制的最短路问题,当且仅当点的颜色一样时可以通行否则需要等到符合条件时才可以通行. ...

  6. SGU 103 Traffic Lights 翻译 题解

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

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

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

  8. Traffic Lights(翻译)

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

  9. 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 ...

最新文章

  1. 模式设计概述:反应器(Reactor)模式
  2. 远程管理客户端--SCCM
  3. linux 修改时区_【003】一文全面掌握Linux初始化进程(超详细)
  4. unity随笔(1)-材质、对象
  5. 基于TableStore/MaxCompute的数据采集分析系统介绍
  6. Nagios配置监控windows客户端
  7. [前缀和][dp] Jzoj P5873 小p的属性
  8. UI自动化之PO模式
  9. 一步到位:手把手教你R语言竞争风险模型建模-列线图-校准曲线-K折验证-外部验证- 决策曲线
  10. 天正坐标标注怎么不显示_cad中坐标标注怎么显示不了xy的
  11. matlab悬臂梁有限元分析
  12. 富邦速配民营银行管理层动荡浪潮之下,振兴银行再迎新帅
  13. 内核block层IO调度器—bfq算法深入探索2
  14. Mac电脑的自动切换输入法
  15. 公众号资源分享欢迎关注
  16. 理解矩阵、矩阵的现实意义(二)
  17. 数加服装样衣进度管理
  18. 苹果11计算机怎么打开语音,iPhone11怎么打开Siri 语音唤醒方法介绍
  19. 【日常实用】git的简单使用
  20. JSP程序+tomcat服务器如何禁止客户端访问非页面形式路径

热门文章

  1. 软件设计师——计算机网络
  2. Linux C++工程师招聘要求汇总
  3. “企业网盘”功能详解【怎么注册企业邮箱】
  4. 微信文件只读模式怎么解除,一步解决新版微信接收文件为只读属性的问题,附带多开和消息防撤回功能
  5. PADS中导入CAD图纸,图形无法闭合一种解决办法
  6. 微信运动接入说明文档
  7. HTML个人简历模板(可在线编辑内容)
  8. 通俗易懂的Docker容器技术简单解释
  9. Aviator表达式
  10. 单片机c语言字符发送函数,求1602显示自定义字符 ℃ 的C语言程序,在写入和读函数多点说明,因为是初学者,...