【BZOJ5047】空间传送装置 最短路
【BZOJ5047】空间传送装置
Description
Input
Output
Sample Input
1 1 5 1
2 2 7 1
1 2 1
2 3 2
3 1 1
Sample Output
6
HINT
1到3:在时刻1使用第一种装置从1传送到2,花费时间3,再等待2单位时间,于时刻6使用第二种装置到达3,花费时间1。
题解:需要发现两个很重要的性质,如果在s时刻到达了某条边的起点,则通过这条边的最短时间是固定的。并且,s越早,通过的时间一定不会越晚,这就意味着在跑最短路时,Dijkstra的贪心策略是行得通的。
所以可以先预处理出f[i][j]代表在j时刻想要通过种类为i的边,所需要的最短时间是多少。因为有%c[i]的存在,所以j最多为3000。我们用前缀和后缀最大值来处理f数组即可。然后就能跑Dij了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include <utility>
#define mp(A,B) make_pair(A,B)
using namespace std;
typedef pair<int,int> pii;
int n,cnt,m,S,E;
int A[2010],B[2010],C[2010],D[2010],head[100010],val[200010],T[55][2010],tmp1[2010],tmp2[2010];
int dis[100010],vis[100010],to[200010],next[200010];
priority_queue<pii> q;
inline void add(int a,int b,int c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd(),S=rd(),E=rd();
int i,j,a,b,c,u;
for(i=1;i<=m;i++)
{
A[i]=rd(),B[i]=rd(),C[i]=rd(),D[i]=rd();
for(j=0;j<C[i];j++) val[j]=(A[i]*j+B[i])%C[i]+D[i];
tmp1[0]=val[0],tmp2[C[i]-1]=C[i]-1+val[C[i]-1];
for(j=1;j<C[i];j++) tmp1[j]=min(tmp1[j-1],j+val[j]);
for(j=C[i]-2;j>=0;j--) tmp2[j]=min(tmp2[j+1],j+val[j]);
for(j=0;j<C[i];j++) T[i][j]=min(C[i]-j+tmp1[j],tmp2[j]-j);
}
memset(head,-1,sizeof(head)),memset(dis,0x3f,sizeof(dis));
for(i=1;i<=E;i++) a=rd(),b=rd(),c=rd(),add(a,b,c);
dis[1]=S;
q.push(mp(-S,1));
while(!q.empty())
{
u=q.top().second,q.pop();
if(vis[u]) continue;
vis[u]=1;
for(i=head[u];i!=-1;i=next[i])
{
if(dis[to[i]]>dis[u]+T[val[i]][dis[u]%C[val[i]]])
{
dis[to[i]]=dis[u]+T[val[i]][dis[u]%C[val[i]]];
q.push(mp(-dis[to[i]],to[i]));
}
}
}
for(i=2;i<=n;i++)
{
if(dis[i]==0x3f3f3f3f) printf("-1\n");
else printf("%d\n",dis[i]-S);
}
return 0;
}//3 2 1 3 1 1 5 1 2 2 7 1 1 2 1 2 3 2 3 1 1
【BZOJ5047】空间传送装置 最短路的更多相关文章
- bzoj5047: 空间传送装置
Description 太空中一共有n座星球,它们之间可以通过空间传送装置进行转移.空间传送装置分为m种,第i种装置可以用4个参 数a_i,b_i,c_i,d_i来描述.因为时空抖动的问题,在非整数时 ...
- BZOJ5047 空间传送装置 2017年9月月赛 最短路 SPFA
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5047 题意概括 概括??~别为难语文做一题错两题的我了…… 题解 我们发现,对于某一种装置,有c种 ...
- bzoj5047 [Lydsy1709月赛]空间传送装置 最短路
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5047 题解 题目中没有说可以停留在一个点等待.问了别人才知道停留是可以的. 那么既然停留是可以 ...
- 【bzoj5047】空间传送装置 堆优化Dijkstra
题目描述 n个点e条边的有向图,每条边是m种类型之一.第i种类型在第x时刻通过所花费的时间为$(a_i*x+b_i)\mod c_i+d_i$.可以在某个点停留.问:在s时刻从1号点出发,到达每个点所 ...
- 【BZOJ 5047 空间传送装置】
Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 282 Solved: 121[Submit][Status][Discuss] Descriptio ...
- 【GDOI】【图论-最短路】时间与空间之旅
最近打的一场校内训练的某题原题... 题目如下: Description 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spa ...
- bzoj 1001狼抓兔子(对偶图+最短路)最大流
推荐文章:<浅析最大最小定理在信息学竞赛中的应用>--周冬 题目 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...
- Vijos1019 补丁VS错误[最短路 状态压缩]
描述 错误就是人们所说的Bug.用户在使用软件时总是希望其错误越少越好,最好是没有错误的.但是推出一个没有错误的软件几乎不可能,所以很多软件公司都在疯狂地发放补丁(有时这种补丁甚至是收费的).T公 ...
- NUC_HomeWork1 -- POJ2067(最短路)
C - Fire Station Description A city is served by a number of fire stations. Some residents have comp ...
随机推荐
- 《memcached全面剖析》
第1章 memcached的基础 1.1 memcached是什么? memcached是高性能的分布式内存缓存服务器. 一般的做法是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态web应用 ...
- 程序员取悦女票的正确姿势---Tip1(iOS美容篇)
代码地址如下:http://www.demodashi.com/demo/11695.html 前言 女孩子都喜欢用美图工具进行图片美容,近来无事时,特意为某人写了个自定义图片滤镜生成器,安装到手机即 ...
- 2014秋C++第5周项目1參考-见识刚開始学习的人常见错误
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,实践要求见http://blog.csdn.net/sxhelijian/a ...
- Swift 泛型參数
原文:http://www.cocoachina.com/newbie/basic/2014/0612/8802.html 本页内容包含:泛型形參语句和泛型实參语句 本节涉及泛型类型.泛型函数以及泛型 ...
- JWT—JSON Web Token - 理解JWT网络间应用用户安全认证交互设计
原文地址:http://blog.leapoahead.com/2015/09/06/understanding-jwt/ 官网地址:https://jwt.io/ JSON Web Token(JW ...
- asp.net 表单数据提交,常见方式与错误总结
在ASP中,我们通常把表单提交到另外一个页面(接受数据页面).但是在ASP.NET中,服务端表单通常都是提交到本页面的,如果我设置 form1.action="test.aspx" ...
- 【转载】html标签语义化
Html语义化标签-语义化你的HTML标签和属性 1 语义化你的HTML标签和属性 1.1 <Hx> 1.2 <p> 1.3 <ul>.<ol>.& ...
- Python内置函数之exec()
exec(object[,gobals[,locals]])这个函数和eval()有相同的作用,用来做运算的. 区别是,exec()可以直接将运算结果赋值给变量对象,而eval()只能运算不能赋值. ...
- Android Studio 使用笔记:[转] Mac下修改Android Studio 所用的JDK版本
原文链接:http://www.jianshu.com/p/d8d1d72d0248# 最近项目从Eclipse+Ant构建模式转移到了Android Studio+Gradle构建模式,自然的JDK ...
- JAVA自定义注解 ------ Annotation
日常开发工作中,合理的使用注解,可以简化代码编写以及使代码结构更加简单,下面记录下,JAVA自定义注解的开发过程. 定义注解声明类. 编写注解处理器(主要起作用部分). 使用注解. 相关知识点介绍, ...