题目描述

n个点e条边的有向图,每条边是m种类型之一。第i种类型在第x时刻通过所花费的时间为$(a_i*x+b_i)\mod c_i+d_i$。可以在某个点停留。问:在s时刻从1号点出发,到达每个点所花费的最小时间。

输入

第一行包含4个正整数n,m,s,e(2<=n<=100000,1<=m<=50,1<=s<=2000,1<=e<=200000)
分别表示星球的个数、空间传送装置的种类数、当前的时间以及空间传送装置的个数。
接下来m行,每行4个正整数$a_i,b_i,c_i,d_i$(1<=$a_i,b_i,c_i,d_i$<=2000),依次描述每种装置的参数。
接下来e行,每行3个正整数$u_i,v_i,w_i$(1<=$u_i,v_i$<=n,$u_i$!=$v_i$,1<=$w_i$<=m)
表示从星球$u_i$可以使用第$w_i$种装置单向传送到星球$v_i$。

输出

输出n-1行,每行一个整数,第i行表示从1到i+1的最少所需时间,若无解输出-1。

样例输入

3 2 1 3
1 1 5 1
2 2 7 1
1 2 1
2 3 2
3 1 1

样例输出

3
6


题解

堆优化Dijkstra

考虑到如果提前到一个点可以等待,因此先到一定不会比后到劣。所以Dijkstra的贪心策略是正确的。

观察每种边通过所需的时间:$(a_i*x+b_i)\mod c_i+d_i$。因此$x$在模$c_i$意义下只有$c_i$种取值。因此可以先预处理出第$i$种道路在模$c_i$等于$j$的时间下所花费的最小时间。通过求后缀最小值维护即可。(由于关系是一个环,因此可以断环倍增以减少代码量)

然后直接跑堆优化Dijkstra即可。

时间复杂度$O(cm+e\log n)$

#include <queue>
#include <cstdio>
#include <cstring>
#include <utility>
#define N 100010
using namespace std;
typedef pair<int , int> pr;
priority_queue<pr> q;
int a[51] , b[51] , c[51] , d[51] , f[51][4010] , head[N] , to[N << 1] , val[N << 1] , next[N << 1] , cnt , dis[N] , vis[N];
inline void add(int x , int y , int z)
{
to[++cnt] = y , val[cnt] = z , next[cnt] = head[x] , head[x] = cnt;
}
int main()
{
int n , m , s , e , i , j , x , y , z;
scanf("%d%d%d%d" , &n , &m , &s , &e);
for(i = 1 ; i <= m ; i ++ )
{
scanf("%d%d%d%d" , &a[i] , &b[i] , &c[i] , &d[i]);
for(j = 0 ; j < c[i] ; j ++ ) f[i][j] = f[i][j + c[i]] = (a[i] * j + b[i]) % c[i] + d[i];
for(j = 2 * c[i] - 2 ; ~j ; j -- ) f[i][j] = min(f[i][j] , f[i][j + 1] + 1);
}
for(i = 1 ; i <= e ; i ++ ) scanf("%d%d%d" , &x , &y , &z) , add(x , y , z);
memset(dis , 0x3f , sizeof(dis));
dis[1] = s , q.push(pr(-s , 1));
while(!q.empty())
{
x = q.top().second , q.pop();
if(vis[x]) continue;
vis[x] = 1;
for(i = head[x] ; i ; i = next[i])
if(dis[to[i]] > dis[x] + f[val[i]][dis[x] % c[val[i]]])
dis[to[i]] = dis[x] + f[val[i]][dis[x] % c[val[i]]] , q.push(pr(-dis[to[i]] , to[i]));
}
for(i = 2 ; i <= n ; i ++ )
{
if(dis[i] != 0x3f3f3f3f) printf("%d\n" , dis[i] - s);
else puts("-1");
}
return 0;
}

【bzoj5047】空间传送装置 堆优化Dijkstra的更多相关文章

  1. codevs1557 热浪(堆优化dijkstra)

    1557 热浪  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 德克萨斯纯朴的民眾们这个夏 ...

  2. BZOJ 3040 最短路 (堆优化dijkstra)

    这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...

  3. UVA - 11374 - Airport Express(堆优化Dijkstra)

    Problem    UVA - 11374 - Airport Express Time Limit: 1000 mSec Problem Description In a small city c ...

  4. BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra

    题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...

  5. 配对堆优化Dijkstra算法小记

    关于配对堆的一些小姿势: 1.配对堆是一颗多叉树. 2.包含优先队列的所有功能,可用于优化Dijkstra算法. 3.属于可并堆,因此对于集合合并维护最值的问题很实用. 4.速度快于一般的堆结构(左偏 ...

  6. POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...

  7. 【堆优化Dijkstra+字典序最短路方案】HDU1385-Minimum Transport Cost

    [题目大意] 给出邻接矩阵以及到达各个点需要付出的代价(起点和终点没有代价),求出从给定起点到终点的最短路,并输出字典序最小的方案. [思路] 在堆优化Dijkstra中,用pre记录前驱.如果新方案 ...

  8. 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra

    题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...

  9. 堆优化Dijkstra计算最短路+路径计数

    今天考试的时候遇到了一道题需要路径计数,然而蒟蒻从来没有做过,所以在考场上真的一脸懵逼.然后出题人NaVi_Awson说明天考试还会卡SPFA,吓得我赶紧又来学一波堆优化的Dijkstra(之前只会S ...

随机推荐

  1. django中介模型,CBV模型,及logging日志配制

    1.中介模型 中介模型,这个是在我们创建表格时,多对多添加的时候应用到的,通过制定ManyToManyField字段中的through参数来定义,为两者的关系新建一个中介class 为什么会产生这个中 ...

  2. HTTP:地址栏输入url到显示页面的步骤

    在浏览器地址栏输入URL 浏览器查看缓存,如果请求资源在缓存中并且新鲜,跳转到转码步骤 如果资源未缓存,发起新请求 如果已缓存,检验是否足够新鲜,足够新鲜直接提供给客户端,否则与服务器进行验证. 检验 ...

  3. 【学时总结】 ◆学时·IV◆ 数位DP

    [学时·IV] 数位DP ■基本策略■ 说白了就是超时和不超时的区别 :) 有一些特别的题与数位有关,但是用一般的枚举算法会超时.这时候就有人提出了--我们可以用动态规划!通过数字前一位和后一位之间的 ...

  4. WIN10下解决Failed installing tomcat X service

    Win10下无法安装Tomcat的service.bat 来看本文的网友想必已经在自己电脑的cmd看了几百遍的Failed installing tomcat X service 字样,也认真检查过自 ...

  5. 第1章 HTML5 概述

    第 1 章  HTML5 概述 学习要点: 1.HTML5 的历史 2.HTML5 的功能 3.HTML5 的特点 4.课程学习问题 HTML5 是继 HTML4.01 和 XHTML1.0 之后的超 ...

  6. Drazil and Tiles CodeForces - 516B (类拓扑)

    Drazil created a following problem about putting 1 × 2 tiles into an n × m grid: "There is a gr ...

  7. 找回被丢弃怎么找都找不回来的git中的commit

    崩溃的一天,打算提代码走人,结果切分支之后,commit丢了= =,找了三个多小时 接下来分享下如何找回丢失的commit的 打开项目所在位置,打开git bash,在gitBASH中输入 git f ...

  8. struct2 命名空间

    转自http://blog.csdn.net/carefree31441/article/details/4857546 使用Struts2,配置一切正常,使用常用tag也正常,但是在使用<s: ...

  9. java线程安全总结 - 2 (转载)

    原文地址:http://www.jameswxx.com/java/%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E6%80%BB%E7%BB%93%EF%BC%88%E4 ...

  10. Android Stadio 相关

    这几天,电脑坏了.重装系统,慢慢的学到了很多Android stadio 的相关知识.总结一下吧: 1.gradle 编译工具:在工程的gradle/wrapper/gradle–wrapper.pr ...