【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 ...
随机推荐
- pickle和cPickle:Python对象的序列化(上)
https://segmentfault.com/a/1190000002493548 pickle模块实现了一种算法,将任意一个Python对象转化成一系列字节(byets).此过程也调用了seri ...
- Quartz与Spring的整合使用
之前说到过Quartz的基本使用(猛戳这里看文章).在实际使用中,我们一般会将定时任务交由spring容器来管理.所以今天我们来说说Quartz与spring的整合. 咱们还是依照Quartz的三大元 ...
- 炫酷的sublimeText开发工具 快捷键总结
sublimeText3绝对是写前端程序的利器.占内存小.启动快.代码提示功能齐全,界面酷炫并且再也不怕断电.了 网上搜罗一些快捷键总结一下.先来张图: (事实上sublimeText3也能够写 ...
- Android自己定义(三)实现圆盘的百分比设置
近期一直在学习自己定义控件,昨天看到群里有人问怎样怎样实现圆盘样式的显示,学有所用,于是乎就有了这篇博客 先上图,一目了然 这里的显示颜色以及颜色块的大小你都能够自己设置 这里设置了三种颜色,相应三种 ...
- Redis之ZSet命令
0.前言 Redis有序集合ZSet可以按分数进行排序, 存储结构可能使用ziplist,skiplist和hash表, zset_max_ziplist_entries和zset_max_zipli ...
- [转]js 获取浏览器高度和宽度值(多浏览器)(js获取宽度高度大全)
IE中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.d ...
- Flex colorTranfrom使用说明
这次使用colorTranfrom主要用来将一个已有的过渡颜色映射到其他颜色条.发现这个colorTranfrom很好使用,于是简单研究了下 文档有说明: 使用 ColorTransform 类调整显 ...
- pthread_cleanup_push和pthread_cleanup_pop清除函数是否执行的说明
示例1: #include <stdio.h> #include <pthread.h> void* clean(void* arg) { printf("clean ...
- 教你实现类似于格瓦拉启动页中的放大转场动画(OC&Swift)
教你实现类似于格瓦拉启动页中的放大转场动画(OC&Swift) 一.前言 用过格瓦拉电影,或者其他app可能都知道,一种点击按钮用放大效果实现转场的动画现在很流行,效果大致如下 在iOS中,在 ...
- virtualenv下使用matplotlib
Unable to “import matplotlib.pyplot as plt” in virtualenv (PyMVPA) SimilarFacedeMacBook-Pro:PyMVPA ...