POJ1158 城市交通Traffic lights IOI 1999 (最短路)
POJ1158 城市交通Traffic lights IOI 1999 (最短路)
(1) 问题描述(probolem)
在d城里交通的安排不同寻常,城中有路口和路口之间的道路,再任意两个不同的路口之间之多有一条道路。从任何一个路口出发,不可能不经过其他路口直接回到该路口。在同一条路道上反正两个方向所需要的通过时间是相同的。在每个路口上只有一盏信号灯,信号灯的颜色在蓝色和紫色之间有规律的交替变化:蓝色有特定的持续时间,紫色也有特定的持续时间,再任意一条道路的两个路口之间,当且仅当这两个路口的信号灯在同一时刻颜色相同时,车辆才被允许实力一个路口驶向另一个路口。如果车辆到达一个路口时,该路口的信号灯正在切换,那么车辆必须组收信号灯的信号。车辆可以在路口等待。你拿到城市地图会显示出以下信息:
所有道路的通过时间(整数)
每一个路口上信号灯两种颜色信号各自的持续时间(整数)
枚一个路口的信号灯得出初始颜色及其发生变化之前的保持时间
你的任务是找出一条路径,使得车辆在交通开始时,用最短的时间,从指定的出发路口到达到指定的目的路口。假设有超过这一条这样的路径,你只需找出一条即可。
(2)假设条件(assumptions)
2<=n<=300,这里n是路口的数量,路口用数字1至n标号。
1<=m<=14,000,这里m是道路的数量。
1<=<=100,这里lij是从路口i到路口j所需要的时间。
1 £ tic £ 100,这里tic是路口i的信号灯显示颜色c的持续时间。下标c为B,或P,分别代表蓝色和紫色。
1 £ ric £ tic这里ric是路口i信号灯初始颜色c的保持时间。
(3)输入(input)
输入是名为lights.inp的正式文件(text file).
第一行保包含两个数:出发路口和目的路口的标号
第二行业包含两个数:N,M.
以下N行包行N个路口的信息,输入文件的第(I+2)行是关于路口I的信息:其中Ci
或是B,或是P,表示路口的信号灯的初始颜色;ric是Ci颜色的保持时间;tIb是蓝色的持续时间,
tiP是紫颜色的持续时间。
最后m行包含m条道路的信息,每一行有三个数:i, j, lij分别是该道路所连接的两个路口的标号及车辆通过时间。
(4)输出(output)
输出文件必须是名为lights.out的正文文件(text file)
如果所搜索的路径存在,则:
第一行包含从出发路口经最捷路径到目的路口所需要的时间。
第二行包含你所发现的最捷路径所经过路口的标号序列,你必须按通过的顺序输出路口的标号。因此,该行的第一个数应是出发路口的标号,而最后一个数则应是目的路口的标号。
如果所搜索的路径不存在,则:
输出文件只有一行,该行知包含一个整数0
(5)例子(example)
lights.inp lights.out:
|
|||
|
|||
解题报告
这个题构建最短路模型比较恶心。首先,在读入边的时候判断那条路永远不可能走,即灯变化的周期互相错开。之后,在最短路判断时要判断颜色是否一样,如果一样,就直接松弛,否者就计算至少要多久才会颜色一样。再判断是否可以松弛。
#include<bits/stdc++.h>
#define Pair pair<int,int>
#define MAXN 400+10
#define MAXM 40000+1
using namespace std;
int n,m,num,head[MAXN],s,t,pre[MAXN],dis[MAXN],v[MAXM];
int bian[MAXM],ans[MAXN];
struct Edge{
int dis,next,to,exi,from;
}edge[MAXM];
struct Crossing{
int co,tc,tp,tb;
}c[MAXN];
void add(int from,int to,int dis)
{
edge[++num].next=head[from];
edge[num].to=to;
edge[num].dis=dis;
edge[num].from=from;
head[from]=num;
edge[num].exi=;
}
int color(int x,int t)
{
int q=t-c[x].tc,r=q%(c[x].tp+c[x].tb);
if(q<)
return c[x].co;
if(c[x].co==)
{
if(r<c[x].tp) return ;
else if(r>=c[x].tp) return ;
}else
if(c[x].co==)
{
if(r<c[x].tb) return ;
else if(r>=c[x].tb) return ;
}
}
void dij()
{
memset(dis,,sizeof(dis));
memset(pre,,sizeof(pre));
memset(v,,sizeof(v));
priority_queue<Pair,vector<Pair>,greater<Pair> > h;
for(int i=;i<=n;i++) dis[i]=;
dis[s]=;
h.push(Pair(dis[s],s));
while(h.size()>)
{
int k=h.top().second;h.pop();
if(v[k]) continue;
v[k]=;
for(int i=head[k];i;i=edge[i].next)
if(dis[k]+edge[i].dis<dis[edge[i].to])
{
int d1=dis[edge[i].to],d2=,dd=dis[edge[i].to]-dis[k],flag=;
int x=edge[i].to,y=edge[i].from;
if(color(edge[i].to,dis[k])==color(edge[i].from,dis[k]))
d2=dis[k]+edge[i].dis,flag=;
else
for(int j=dis[k];j<=dis[edge[i].to];j++)
{
if(color(edge[i].to,j)==color(edge[i].from,j))
{d2=j+edge[i].dis;flag=;break;}
}
if(flag==&&d2<dis[edge[i].to])
{
dis[edge[i].to]=d2;
pre[edge[i].to]=i;
h.push(Pair(d2,edge[i].to));
}
}
}
} int main()
{ scanf("%d%d%d%d",&s,&t,&n,&m);
for(int i=;i<=n;i++)
{
char k[];
scanf("%s%d%d%d",k,&c[i].tc,&c[i].tb,&c[i].tp);
if(k[]=='B') c[i].co=;
else if(k[]=='P') c[i].co=;
}
for(int i=;i<=m;i++)
{
int x,y,z,e=;
scanf("%d%d%d",&x,&y,&z);
if(c[x].tp==c[y].tb&&c[y].tp==c[x].tb)
{
if(c[x].tc==c[y].tc&&c[x].co!=c[y].co) e=;
else if(c[x].tc!=c[y].tc&&abs(c[x].tc-c[y].tc)%(c[x].tp+c[x].tb)==) e=;
else if(c[x].tc==c[y].tc&&abs(c[x].tc-c[y].tc)%(c[x].tp+c[x].tb)==c[x].tb) e=;
else if(c[x].tc==c[y].tc&&abs(c[x].tc-c[y].tc)%(c[x].tp+c[x].tb)==c[x].tp) e=;
}
if(!e)
add(x,y,z),
add(y,x,z);
} dij();
if(dis[t]==) {printf("0\n");return ;}
printf("%d\n",dis[t]);
for(int i=pre[t];i;i=pre[edge[i].from])
ans[++ans[]]=edge[i].from;
for(int i=ans[];i>=;i--)
{
printf("%d ",ans[i]);
}printf("%d\n",t);
return ;
}
POJ1158 城市交通Traffic lights IOI 1999 (最短路)的更多相关文章
- 快速切题 sgu103. Traffic Lights 最短路 难度:1
103. Traffic Lights Time limit per test: 0.25 second(s)Memory limit: 4096 kilobytes input: standardo ...
- sgu 103 Traffic Lights 解题报告及测试数据
103. Traffic Lights Time limit per test: 0.25 second(s) Memory limit: 4096 kilobytes 题解: 1.其实就是求两点间的 ...
- 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 城市的交通规则非常奇怪,城市公路通过路口相连,两个不同路口之间最多 ...
- Traffic Lights - SGU 103(最短路)
题目大意:有一个城市的路线图,有N个交叉点,每两个交叉点之间只有一条路,现在想从交点u去交点v,不过这个路的交通比较特别,每个路都有一个交通灯,灯有两种颜色,蓝色和紫色,例如一条路线在交点s,t之间, ...
- SGU 103 Traffic Lights【最短路】
题目链接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=16530 题意: 给定每个点最初的颜色,最初颜色持续时间,以 ...
- sgu 103 Traffic Lights
这道题难得不是算法,而是处理. 题意就是让你求最短路,只有当两个点在某一秒颜色相同时,这条边才可以通行,输入首先给你 起点和终点, 然后给你 点数和边数, 接下来 n 行 初始颜色,初始颜色持续时间, ...
- TRAFFIC LIGHTS POJ 1158
题目大意: 在Dingilville 城市安排是一种不同寻常的方式,每个交叉路口有一条道路连接,一条道路最多连接两个不同的交叉路口.每个交叉路口不能连接他自己.道路旅行一端到另一端的时间是相同的,任何 ...
- Light oj 1281 - New Traffic System 多状态最短路
题目大意:有向图,新计划的地铁,有k个计划新路,利用现有的铁路.k条新路和限定只能用d条新路,找出从0到n-1的最短路径 题目思路:用dist[u][use],储存使用use条新路,到达节点u的最短路 ...
随机推荐
- c#0218-命名空间
1 namespace 命名空间 可以解决类的重命名问题 可以看做是类的文件夹: 2 跨项目使用类 一个解决方案下有不同的项目,如果想在一个项目中引用另一个项目的类,解决方法是 1 添加引用 2 引用 ...
- 1112 KGold
给出N个人在0时刻的财富值M[i](所有人在0时刻的财富互不相等),以及财富增长速度S[i],随着时间的推移,某些人的财富值会超越另外一些人.如果时间足够长,对于财富增长最快的人来说,他的财富将超越所 ...
- 大O时间复杂度
大O表示法指出了在最糟情况下的运行时间.比较操作数,指出了算法运行时间的增速 常见的大O运行时间 O(logn):也叫对数时间,包括二分查找 O(n):也叫线性时间,包括简单查找 O(nlogn):包 ...
- 洛谷 P2279 [HNOI2003]消防局的设立 (树形dp or 贪心)
一看到这道题就知道是树形dp 之前做过类似的题,只不过保护的范围是1 所以简单很多. 这道题保护的范围是2,就复杂了很多. 我就开始列状态,然后发现竟然有5种 然后我就开始列方程. 但是我考虑的时候是 ...
- 【BZOJ 1503】[NOI2004]郁闷的出纳员
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 因为所有人工资同时递减. 所以可以设置一个变化值delta. 然后每个人的初始值为k 则把k-delta加入伸展树中. 会发现del ...
- Qt之图形(绘制漂亮的圆弧)
简述 综合前面对二维绘图的介绍,想必我们对一些基本绘图有了深入的了解,下面我们来实现一些漂亮的图形绘制. 简述 圆形 效果 源码 弧形 效果 源码 文本 效果 源码 旋转 效果 源码 圆形 经常地,我 ...
- oracle 登录
命令行登录 sql plus登录 plsql登录 自己电脑登录 既然是登录自己电脑的数据库,肯定是已经安装过了oralce,而且已经创建了数据库等等. 局域网登录 1.必须安装oracleclient ...
- bzoj1497【NOI2006】最大获利
1497: [NOI2006]最大获利 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 3437 Solved: 1674 [id=1497" ...
- Session、Cookie总结
什么是sessnion,session存在哪,能存多久.怎么设置他的存储时间 一.什么是session 1.session 被翻译为会话.当client(一般都是浏览器作为client)訪问serve ...
- 如何解读「量子计算应对大数据挑战:中国科大首次实现量子机器学习算法」?——是KNN算法吗?
作者:知乎用户链接:https://www.zhihu.com/question/29187952/answer/48519630 我居然今天才看到这个问题,天……本专业,有幸听过他们这个实验的组会来 ...