103. 交通灯
每个测试点:0.5s
内存限制:4096KB

  在Dingilville市城市交通的安排很不寻常,公路连接着路口,在两个不同的路口之间最多有一条公路连接,没有公路会连接一个路口自身。正反向通过一条道路的时间是相同的,在每一个路口都有一个交通灯,在任意时刻它要么是蓝色的要么是紫色的,这些灯的颜色是定期交换的:蓝色持续一段时间,紫色持续一段时间。当一条公路两边的交通灯颜色相同时才允许汽车离开一个路口去另一个路口。如果一辆车到达一个路口时的瞬间交通灯的颜色改变了,那就需要重新考虑新的颜色。车辆允许在一个路口进行等待。你将得到关于城市的下列信息:

  • 每条公路通过所需要的时间(整数)
  • 每一个路口两种交通灯的颜色的持续时间(整数)
  • 和每个路口的交通灯的初始颜色和持续时间(整数)

  你的任务就是寻找一辆车从给定起始路口到给定终止路口所需要的最短时间。如果这样的路径不止一个,你只能输出其中的一个。

输入:
  第一行包括两个数字:起始路口和终止路口。
  第二行包含两个数字:n和m。
  接下来的n行包含n个路口的信息:第(i+2)行给出了第i个路口的信息:CiriCtiBtiP。C就是第i个路口的交通灯的初始颜色,要么是B(蓝色)或者P(紫色)。
  最后接下来的m行包含m条公路的信息,每行都有: ijlij。路口i到路口j由这条公路连接。

   2 ≤ N ≤ 300,N代表路口的个数,公路由1~N的整数来标识。 1 ≤ M ≤ 14000,M代表公路的个数。 1 ≤ lij ≤ 100  从路口i到达路口j所需的时间

2011年6月5日 21时41分50秒---暂时还没翻译完,剩下的明天继续把。
   1 ≤ tiC ≤ 100, tiC代表第i个路口C颜色的交通灯的持续时间,C只能是'B'或者'P'。 1 ≤ riC ≤ tiCriC是i路口的交通灯初始颜色c的持续时间。

输出:
  如果存在这样一条路径:

  • 第一行输出从 起始路口到给定终止路口所需要的最短时间。
  • 第二行输出你找到的路径,从起始路口出发到 终止路口。

  如果这样的路径不存在:

  • 输出0。

样例:

输入
输出
1 4
4 5
B 2 16 99
P 6 32 13
P 2 87 4
P 38 96 49
1 2 4
1 3 40
2 3 75
2 4 76
3 4 77
127
1 2 4

================================华丽的分割线 ================================

  严重鄙视自己,很明显需要独立一个wait(x, y, t)函数作为子函数,在路口x通往路口y时所需要等待交通灯变得相同的时间,如果不需要等待则为0;需要不可能相同则为∞,但是想了好久没想到wait函数该怎么写,到网上搜了一下,具体看代码里的实现吧,然后就可以转化成为一个单元最短路径了。再鄙视一次自己,找了好久一个问题不知道错在哪里,第6个数据,最后发现竟然是当无法到达的时候我输出的不是0而是我定义的INF,对自己死心了,提交了6次!!!
  推荐一个人的题解(后面是时空复杂度引用他的):
  http://hi.baidu.com/yali79/blog/item/7308f562342361dae7113a8c.html

时空复杂度
时间O(C*N2)   --Dijkstra          C是计算wait函数的重复次数,可看做4O(C*K*M)  --SPFA              K是SPFA算法的时间系数,可以看做1
空间 O(N2)     --临接矩阵O(N+M)    --临接表/前向星/十字链表

我的代码:

#include <stdio.h>
#include <stdlib.h>
#define INF 0XFFFFFFF
struct node{
int c, r;
int t[2];
}node[301];
int map[301][301];
int s, t;
int m, n;

int dis[301];
int used[301];
int from[301];

int min(int a, int b)
{
return a < b ? a : b;
}

int getcolor(int i, int k, int *t)
{
int x;
if(k < node[i].r){
*t = node[i].r - k;
return node[i].c;
}
x = k - node[i].r;
x %= node[i].t[0] + node[i].t[1];
if(x < node[i].t[1]){
*t = node[i].t[1] - x;
return 1 - node[i].c;
}else{
*t = node[i].t[1] + node[i].t[0] - x;
return node[i].c;
}
}

int wait(int a, int b, int k)
{
int i;
int t = 0;
int x, y;
for(i = 1; i <= 3; i++){
if(getcolor(a, k, &x) == getcolor(b, k, &y)){
return t;
}
k += min(x, y);
t += min(x, y);
}
return INF;
}

int srch(int s)
{
int i, j;
int a, b;
for(i = 1; i <= n; i++){
dis[i] = INF;
}
dis[s] = 0;
for(j = 1; j < n; j++){
b = INF;
for(i = 1; i <= n; i++){
if(!used[i] && dis[i] < b){
s = i;
b = dis[i];
}
}
if(s == t){
break;
}
used[s] = 1;
for(i = 1; i <= n; i++){
if(!used[i] && map[s][i]){
a = wait(i, s, dis[s]);
if(dis[i] > dis[s] + map[s][i] + a){
dis[i] = dis[s] + map[s][i] + a;
from[i] = s;
}
}
}
}
return dis[t];
}

void output(int t)
{
if(t == s){
printf("%d", t);
return;
}
output(from[t]);
printf(" %d", t);
}

int main(int argc, char **argv)
{
int i;
int a, b;
scanf("%d%d", &s, &t);
scanf("%d%d\n", &n, &m);
for(i = 1; i <= n; i++){
a = 0;
scanf("%c%d", (char *)&a, &node[i].r);
if(a == 'B'){
node[i].c = 0;
scanf("%d%d\n", &node[i].t[0], &node[i].t[1]);
}else{
node[i].c = 1;
scanf("%d%d\n", &node[i].t[1], &node[i].t[0]);
}
}
for(i = 0; i < m; i++){
scanf("%d%d", &a, &b);
scanf("%d", &map[a][b]);
map[b][a] = map[a][b];
}
a = srch(s);
if(a == INF){
printf("0\n");
}else{
printf("%d\n", a);
output(t);
printf("\n");
}
return 0;
}

转载于:https://www.cnblogs.com/yylogo/archive/2011/06/05/SGU-103.html

SGU 103 Traffic Lights 翻译 题解相关推荐

  1. SGU 103 Traffic Lights

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

  2. SGU 103 Traffic Lights【最短路】

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

  3. SGU 103 Traffic Lights(最短路)

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

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

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

  5. SGU 103 Traffic Lights (最短路)

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

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

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

  7. Traffic Lights(翻译)

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

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

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

  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. matlab game of life,模拟器cellular auotomata元胞自动机 matlab
  2. 3em html5,谁是最好的手机浏览器:IE9 VS Safari 5
  3. oracle12数据库安装步骤,ORACLE RAC 12C(12.2.0.1)数据库软件安装步骤
  4. Cgroup 研究报告
  5. Ruby Shanghai 2014年终聚会总结
  6. Hello Blazor:(11)全局截获事件执行
  7. P2305 [NOI2014] 购票(点分治、斜率优化)
  8. 开启你的开源项目生涯_了解如何在5分钟内以开源方式开始您的职业生涯
  9. leetcode 高薪_利用两种不同的方法解LeetCode第1312题:让字符串成为回文串的最少插入次数
  10. 九阴真经 服务器列表文件,《九阴真经》部分服务器互通升级公告
  11. iPhone iPhoneSimulator.platform/Developer/usr/bin/clang++ failed with exit code 1 出现这种错误的原因是...
  12. 语音自动识别文字软件
  13. iOS底层探索之KVO(五)—FBKVOController分析
  14. NRF24L01模块的2个注意点
  15. 西部数据硬盘不同色彩的含义
  16. 项目经理面试的一些问题讨论
  17. 西安交大计算机考研分数线2020院线,西安交通大学2020年复试分数线
  18. 计算机专业软件工程的二本大学有哪些,全国软件工程专业大学排名 一本二本大学名单...
  19. django之admin调整页面展示
  20. 自己做的一个超级简单的小游戏

热门文章

  1. 阿里云ACK联合云效助力上海博卡DevOps转型
  2. 《数据科学导论》期末复习整理~2020
  3. 技术社区里的社会规范与市场规范
  4. 普通用户常用的CRF和ABR码率控制模式在H264中的应用
  5. netty-writeAndFlush的输出顺序
  6. Firefox源码编译(Windows)
  7. Linux 进程状态
  8. 阿里云智能接入网关SAG通过可信云SD-WAN方案认证
  9. spark core面试专题
  10. 基于Nacos的注册中心与配置中心