题目链接:

http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=16530

题意:

给定每个点最初的颜色,最初颜色持续时间,以及每个颜色的持续时间。每个点的颜色蓝紫交替,只有等待到一条路的两个端点颜色相同才能通行。到达某点时颜色恰好变色,则按照变色之后的颜色考虑。
给定道路的花费,问最少需要多少时间。

分析:

最短路问题。
dijk可做,麻烦之处在于要加上等待时间。对于每个点,判断相邻点颜色是否一致,不一致则选取当前颜色持续时间较短的一个作为等待时间。颜色相同的循环周期最多3次,3次之后颜色仍然无法一致则该路不通。
注意点数很少,边数很多,肯定有重边存在,选择邻接矩阵的形式。

代码:

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
#define sa(a) scanf("%d", &a)
#define fi first
#define se second
#define MEM(a, b) memset(a, b, sizeof(a));
typedef pair<int, int >p;
const int maxn = 300 + 5, INF = 0x3f3f3f3f;
struct junction{int color; int r; int t[2];};
junction j[maxn];
int pa[maxn];
int dist[maxn];
int ss, tt;
int mm[maxn][maxn];
int getcolor(int time, int u)
{if(time < j[u].r) return j[u].color;int res = (time - j[u].r) % (j[u].t[0] + j[u].t[1]);if(res < j[u].t[1 - j[u].color]) return 1 - j[u].color;return j[u].color;
}
int hold(int u, int v, int time)
{int ans = 0;int cnt = 0;int res1, res2, res;while(cnt < 3){int cc = getcolor(time, u);int ccc = getcolor(time, v); if(cc == ccc) return ans;if(time< j[v].r) res1 = j[v].r - time;else{res = (time - j[v].r) % (j[v].t[0] + j[v].t[1]);if(ccc == j[v].color) res1 = j[v].t[0] + j[v].t[1] - res;else res1 = j[v].t[ccc] - res;}if(time < j[u].r) res2 = j[u].r - time;else{res = (time - j[u].r) % (j[u].t[0] + j[u].t[1]);if(cc == j[u].color) res2 = j[u].t[0] + j[u].t[1] - res;else res2 = j[u].t[cc] - res;}ans += min(res1, res2);time += min(res1, res2);cnt++;}return -1;
}
void dijkstra(int n)
{priority_queue<p>q;q.push(p(0,ss));dist[ss] = 0;while(!q.empty()){p t = q.top();q.pop();int u = t.se;if(t.fi > dist[u]) continue;for(int i = 1; i <= n;i++){if(mm[u][i] == INF) continue;int tmp =  hold(i, u, dist[u]);if(tmp == -1) continue;if(mm[i][u] + tmp + dist[u] < dist[i]){pa[i]=u;dist[i] = mm[i][u] + tmp + dist[u];q.push(p(dist[i], i));}}}
}
void init()
{MEM(pa, -1);MEM(dist, 0x3f);MEM(mm, 0x3f);
}
void output(int t)
{if(t == -1) return;output(pa[t]);printf("%d ", t);
}
int main (void)
{sa(ss),sa(tt);init();int n, m; sa(n),sa(m);char c;int a, b, d, t;getchar();for(int i = 1; i <= n; i++){if(getchar() == 'B') t = 0;else t = 1;scanf("%d%d%d", &a, &b, &d);j[i].color = t;j[i].r = a;j[i].t[0] = b;j[i].t[1] = d;getchar();}for(int i = 0; i < m; i++){scanf("%d%d%d", &a, &b, &d);mm[a][b] = mm[b][a] = d;}dijkstra(n);if(dist[tt] == INF) return printf("0\n"), 0;printf("%d\n", dist[tt]);output(tt);return 0;
}

SGU 103 Traffic Lights【最短路】相关推荐

  1. SGU 103 Traffic Lights(最短路)

    这题不错,是一个最短路,但是中间有一个限制条件,就是等待时间 首先先看一下为什么仍然满足最短路 因为最短路肯定是每个结点求出最早到达的时间,那么其实不管有没等待,从队头取出去转移的肯定是最早的时间,仍 ...

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

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

  3. SGU 103 Traffic Lights (最短路)

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

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

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

  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. [转] python运行时内存分析工具meliae
  2. 快递春节停运时间表刷屏,假的!但或涨价10-20元
  3. 如何将 Microsoft Bot Framework 链接至微信公共号
  4. 哥德巴赫猜想(升级版)(洛谷-P1579)
  5. Swift中文教程(十八) 类型检查
  6. VLC设置串流的TTL值
  7. Microsoft Visual Studio Ultimate 2012 ISO 映像
  8. 通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)
  9. 十大排序算法(数据结构)
  10. 双系统linux开机黑屏,解决双系统中ubuntu开关机异常,黑屏,出现“nouveau , SCHED_ERROR”字样等的问题...
  11. 《网格交易法数学+传统智慧战胜华尔街》内容介绍及PDF下载
  12. C# 中的委托和事件[转自张子扬]
  13. angular设置路由实现无刷新跳转
  14. SpringCloud知识点总结
  15. python人工智能项目实战 桑塔努·帕塔纳亚克 pdf_Python人工智能项目实战
  16. lambda表达式:
  17. Java-List集合元素筛选
  18. 全球及中国BTK抑制剂市场发展状况与投资前景建议报告2022-2028年
  19. 1.1 嵌入式系统概述
  20. 案例:红酒数据集分析

热门文章

  1. 一些实用的APP分享
  2. tab 多播linux,Linux
  3. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于Java的在线点餐系统8wv3v
  4. 罗素的《数理哲学导论》
  5. java 中文简体与繁体的转换
  6. OTT盒子产业链全景图---OTT盒子主流CPU方案平台、主要终端厂商和代表作品盘点
  7. 二取二计算机测试,一种新型二乘二取二安全计算机系统.pdf
  8. 结构方程模型(SEM)
  9. Cloneable接口以及深拷贝和浅拷贝
  10. python choices_python测试开发django-40.模型(model)中choices使用