Traffic Lights - SGU 103(最短路)
题目大意:有一个城市的路线图,有N个交叉点,每两个交叉点之间只有一条路,现在想从交点u去交点v,不过这个路的交通比较特别,每个路都有一个交通灯,灯有两种颜色,蓝色和紫色,例如一条路线在交点s,t之间,如果想从s走到t,那么只有等s和t的交通灯的颜色一致的时候才可以从s走,求出来从u到v的最短时间。
分析:比较明显能看出来是一个最短路问题,不过里面夹杂的这个交通灯比较恶心,要随时能求出来两点点下一个相同颜色的时间,如果使用时间去枚举无疑是个比较笨的方法,注意到有个剩余时间,并且交通灯的每种颜色存在的最大值是100,所以可以判断出,一定会有重复情况出现,比如s剩余a,t剩余b,这种状态再次出现不会超过200次蓝紫灯循环,所以只需要枚举200次即可,如果还是找不带相同颜色,那么就说明这条路不能行走。ps.时间内存都比较小,边数比较多,所以邻接矩阵比连接表更省内存,注意有可能会有重边的情况。
代码如下:
=========================================================================================================================
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; const int MAXN = ;
const int oo = 1e9+; struct Junction
{
int op;///等于0是B, 等于1代表P
int Last;///剩余时间
int t[];///两种灯的转换时间 Junction NewOp(int time)
{///time时刻的状态
Junction res;
if(time >= Last)
{///当前时间大于剩余时间,等于的时候也需要转变成下一个灯
time -= Last;
time %= (t[]+t[]); if(time >= t[op^])
{
res.op = op;
res.Last = t[op] - (time-t[op^]);
}
else
{
res.op = op^;
res.Last = t[op^]-time;
}
}
else
{
res.op = op;
res.Last = Last - time;
} res.t[] = t[], res.t[] = t[]; return res;
}
int SameColor(Junction a, Junction b)
{///两个路灯下个相同颜色最少需要时间,-1表示不可能相同
///因为中间涉及到值得改变,所以不使用指针
int i, time=; for(i=; i<; i++)
{
if(a.op == b.op)
return time;
else if(a.Last >= b.Last)
{
time += b.Last;
a.Last -= b.Last;
b.Last = ;
}
else if(a.Last < b.Last)
{
time += a.Last;
b.Last -= a.Last;
a.Last = ;
} if(a.Last == )
{
a.op ^= ;
a.Last = a.t[a.op];
}
if(b.Last == )
{
b.op ^= ;
b.Last = b.t[b.op];
}
} return -;
}
}; Junction p[MAXN];///交叉点
int N;///交叉点个数
int G[MAXN][MAXN]; void Dij(int start, int end)
{
int dist[MAXN], path[MAXN]={};
int visit[MAXN]={}; for(int i=; i<=N; i++)
dist[i] = oo;
dist[start] = ; for(int t=; t<N; t++)
{
int index=start, Min=oo; for(int i=; i<=N; i++)
{
if(visit[i] == false && dist[i] < Min)
{
Min = dist[i];
index = i;
}
} if(visit[index])
break;
visit[index] = true; Junction u = p[index].NewOp(dist[index]), v; for(int i=; i<=N; i++)
{
if(!visit[i] && G[index][i] != oo && dist[i]>dist[index]+G[index][i])
{
v = p[i].NewOp(dist[index]);
int time = u.SameColor(u, v); if(time != - && dist[i] > dist[index]+G[index][i]+time)
{
dist[i] = dist[index] + G[index][i] + time;
path[i] = index;
}
}
}
} if(dist[end] == oo)
printf("0\n");
else
{
printf("%d\n", dist[end]); int k=, ans[MAXN]; while(end)
{
ans[k++] = end;
end = path[end];
} for(int i=k-; i>=; i--)
printf("%d%c", ans[i], i==?'\n':' ');
}
} int main()
{
int M, start, end;
char s[]; scanf("%d%d%d%d", &start, &end, &N, &M); for(int i=; i<=N; i++)
{
scanf("%s%d%d%d", s, &p[i].Last, &p[i].t[], &p[i].t[]);
p[i].op = (s[]=='B' ? : );
} int u, v, len; for(int i=; i<=N; i++)
for(int j=; j<=N; j++)
G[i][j] = oo; while(M--)
{
scanf("%d%d%d", &u, &v, &len);
G[u][v] = G[v][u] = min(G[u][v], len);
} Dij(start, end); return ;
}
Traffic Lights - SGU 103(最短路)的更多相关文章
- POJ1158 城市交通Traffic lights IOI 1999 (最短路)
POJ1158 城市交通Traffic lights IOI 1999 (最短路) (1) 问题描述(probolem) 在d城里交通的安排不同寻常,城中有路口和路口之间的道路,再任意两个不同的路口之 ...
- sgu 103 Traffic Lights 解题报告及测试数据
103. Traffic Lights Time limit per test: 0.25 second(s) Memory limit: 4096 kilobytes 题解: 1.其实就是求两点间的 ...
- 快速切题 sgu103. Traffic Lights 最短路 难度:1
103. Traffic Lights Time limit per test: 0.25 second(s)Memory limit: 4096 kilobytes input: standardo ...
- Traffic Lights
Traffic Lights time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- SGU 103.Traffic Lights(最短路)
时间: 0.50 second(s) 空间: 4096 kilobytes 输入: 标准输入 输出: 标准输出 Dingiville 城市的交通规则非常奇怪,城市公路通过路口相连,两个不同路口之间最多 ...
- SGU 103 Traffic Lights【最短路】
题目链接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=16530 题意: 给定每个点最初的颜色,最初颜色持续时间,以 ...
- sgu 103 Traffic Lights
这道题难得不是算法,而是处理. 题意就是让你求最短路,只有当两个点在某一秒颜色相同时,这条边才可以通行,输入首先给你 起点和终点, 然后给你 点数和边数, 接下来 n 行 初始颜色,初始颜色持续时间, ...
- sgu 185 最短路建网络流
题目:给出一个图,从图中找出两条最短路,使得边不重复. 分析:既然是最短路,那么,两条路径上的所有节点的入边(s,x).出边(x,e)必定是最优的,即 dis[x] = dis[s]+edge_dis ...
- TRAFFIC LIGHTS POJ 1158
题目大意: 在Dingilville 城市安排是一种不同寻常的方式,每个交叉路口有一条道路连接,一条道路最多连接两个不同的交叉路口.每个交叉路口不能连接他自己.道路旅行一端到另一端的时间是相同的,任何 ...
随机推荐
- framework 4.5.1安装时发生严重错误
http://jingyan.baidu.com/article/a501d80c0a74b4ec630f5ee5.html http://jingyan.baidu.com/article/d807 ...
- 协程的作用 Python
1.协程的含义和实现 协程是单进程单线程的超越函数的调度机制,它通过一定的调度手段进行调度. (Python使用generator机制,greenlet使用汇编控制对程序指向来实现). 2.协程有什么 ...
- redis数据类型(字符串)
字符串 这是最简单Redis类型.如果你只用这种类型,Redis就像一个可以持久化的memcached服务器 127.0.0.1:6379> set mykey somevalue OK 127 ...
- ubuntu14.04 开启root登陆
想要在登录界面使用root身份登录,可编辑/usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf文件, sudo gedit /usr/share/light ...
- CentOS6.5使用本地光盘做yum源 (参考:http://www.jb51.net/os/RedHat/43343.html)
一.使用光盘做yum源安装软件 mkdir /media/CentOS #新建CentOS挂载目录 mount -t auto /dev/cdrom /media/CentOS #挂载CentOS光 ...
- Z-BLOG模板结构图
(转自ZB官方论坛,作者:未寒)
- 十进制和n进制的转换(10进制转换为36进制)
答案如下: void Convert() { map<int ,string> maps; maps[0]="0"; maps[1]="1"; ma ...
- Shell之test
test命令用法.功能:检查文件和比较值 1)判断表达式 if test (表达式为真) if test !表达式为假 test 表达式1 –a 表达式2 两个表达式 ...
- IE8,IE9,IE10绿色版,以及ColorPix
对于开发者而言IETest是一坨屎. 但是我们终于迎来的蛋糕和火腿,今天无意间发现了竟然有绿色版的浏览器版本,IE9,IE10已经下到本地,IE8网传是有的,但是没有找到合适的版本.但是足够了,本机使 ...
- EQueue 2.3.2
EQueue 2.3.2版本发布(支持高可用) 前言 前段时间针对EQueue的完善终于告一段落了,实在值得庆祝,自己的付出和坚持总算有了成果.这次新版本主要为EQueue实现了集群功能,基本实现了B ...