高玩小Q不仅喜欢玩寻宝游戏,还喜欢一款升级养成类游戏。在这个游戏的世界地图中一共有n个城镇,编号依次为1到n。

这些城镇之间有m条单向道路,第i 条单项道路包含四个参数ui,vi,ai,bi,表示一条从ui号城镇出发,在vi号城镇结束的单向道路,因为是单向道路,这不意味着小Q可以从vi沿着该道路走到ui。小Q的初始等级level为1,每当试图经过一条道路时,需要支付cost=log2level+ailevel点积分,并且经过该道路后,小Q的等级会提升ai级,到达level+ai级。但是每条道路都会在一定意义上歧视低消费玩家,准确地说,如果该次所需积分cost < bi,那么小Q不能经过该次道路,也不能提升相应的等级。

注意:本游戏中等级为正整数,但是积分可以是任意实数。

小Q位于1号城镇,等级为1,现在为了做任务要到n号城镇去。这将会是一次奢侈的旅行,请写一个程序帮助小Q找到需要支付的总积分最少的一条路线,或判断这是不可能的。
Input
第一行包含一个正整数T(1≤T≤30),表示测试数据的组数。

每组数据第一行包含两个整数n,m(2 ≤ n ≤ 100000,1 ≤ m ≤ 200000),表示城镇数和道路数。

接下来m行,每行四个整数ui,vi,ai,bi(1≤ui,vi≤n,ui≠vi,0≤ai≤109,0≤bi≤60),分别表示每条单向道路。
Output
对于每组数据,输出一行一个整数,即最少所需的总积分的整数部分,如:4.9999输出4,1.0输出1。若不存在合法路线请输出−1。
Sample Input
1
3 3
1 2 3 2
2 3 1 6
1 3 5 0
Sample Output
2

分析:首先这题肯定是个最短路没的说,重点是如何处理,因为有level的存在,看似其使得边权变成了动态的,对于一条边,固定的唯有一个ai值,还要对这个ai值做log2((leveli+a(i+1))/leveli)的处理才是真正的边权。但其实可以通过化简使题目多余的限制去掉。

首先在当前点的等级设为level i ,在选择边时,有a[i+1]用于计算通过该边的花费。
对于log2(n)对数,我们知道有,log2(x/y)=log2(x)-log2(y),因此,若当前从i- > j- > k

原式计算花费cost为 log2((level[i] +a[j])/level[i]) + log2((level[j] +a[k])/level[j])
转换为减法后 log2(level[i]+a[j]) - log2(level[i]) + log2(level[j]+a[k]) - log2(level[j])

可以发现在行走过程中,level是如何变化的,是通过level[i]+a[j]得到了,也就是说,实际上level【i】+a【j】=level【j】。

在上式中通过等价替换,log2(level[i]+a[j])与- log2(level[j])因为相等被抵消掉了,剩余 - log2(level[i]) + log2(level[j]+a[k]) 为i->k的花费

在看,我们从起点到到达终点的总花费是如何计算的,即Σ(i=1~n) log2((level[i]+a[k])/leve[i]),其中,1~n指从起点出发到达终点的最短路径,而不是1~n所有节点。a[k]表示当前结点出发,下一条边的增加等级。转换为求和式即:
原式= log2((level[1]+a[k1])/level[1]) + log2((level[2]+a[k2])/level[2]) + log2((level[3]+a[k3])/level[3]) + …………+log2((level[n-1]+a[kn-1])/level[n-1])

根据上面的化简式,发现两项之间的分子和分母可以抵消掉。化简后得到:
-log2(level[1])+log2(level[n-1]+a[kn-1])
其中,题目已经说明,初始等级level为1级,那么前面那项 -log2(level[1])即值为0。也就是说,最终结果即log2(level[n-1]+a[kn-1])这一个式子。这个值拿去log2不谈,level[n-1]+a[kn-1]这个值,不就是从起点开始到终点n前的一个点的最小ai值之和吗,之后机上了a[kn-1]即达到终点那条边的最后一个a值,简单来说,即我们所要求的的最短路,其实和等级level毫无关系,全部被化简掉了,整整要求的最短路的边权,其实就是每条边上增长的等级ai,也就是说,把ai放到图上的边权中,裸的求一个最短路再对结果取log2即可。

题目中还有一种限制,要求花费cost小于边上限制bi时,不需通过。我们已经把边权转换成了整数值,是不能再对其进行取log再与bi比较的,况且可能有精度损失。因此对于不等式 cost=log2((level+ai)/level ) < bi 对数逆运算,两边变为指数形式,即:
(level[i] +a[j])/level[i] < 2^(bi)去掉了前式的log,直接以整数形式对比两值判断是否能通过某条边。

最后注意一下,最短路dijkstra的过程中若没有用vis标记一下出队列的节点会超时。。。这是之前没做vis标记是从没出现过的情况orz也算是给自己做的警示了。

AC代码

hdu6290奢侈的旅行的更多相关文章

  1. HDU-6290 奢侈的旅行 (Dijkstra+堆优化)

    高玩小Q不仅喜欢玩寻宝游戏,还喜欢一款升级养成类游戏.在这个游戏的世界地图中一共有nn个城镇,编号依次为11到nn.这些城镇之间有mm条单向道路,第ii 条单项道路包含四个参数ui,vi,ai,biu ...

  2. hdu6290 奢侈的旅行

    最短路算法的复杂度考虑! 书上已经做了优化,用的是优先队列:用优先队列实现堆优化 V为点集,E为边集 从O(V^2)优化到O(ElogV) 然后再记忆一下inf 0x3f3f3f3f的十进制是1061 ...

  3. HDU-6290_奢侈的旅行(Dijstra+堆优化)

    奢侈的旅行 Time Limit: 14000/7000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) Problem De ...

  4. 2018CCPC-女生专场

    (咕咕咕,咕了快一年的bu题.. A.CCPC直播 传送:http://acm.hdu.edu.cn/showproblem.php?pid=6297 题意:rt. 分析:模拟. #include&l ...

  5. "字节跳动杯"2018中国大学生程序设计竞赛-女生专场 Solution

    A - 口算训练 题意:询问 $[L, R]$区间内 的所有数的乘积是否是D的倍数 思路:考虑分解质因数 显然,一个数$x > \sqrt{x} 的质因子只有一个$ 那么我们考虑将小于$\sqr ...

  6. CCPC-WFinal-女生专场

    1001:CCPC直播   字符串处理,几个if语句 1002:口算训练   前缀和处理<=根号n的因数,大于根号n的因数每个数至多有一个,用vector存下每个大因数的位置,map离散化.查询 ...

  7. 跨界玩AR,迪奥、Hugo Boss等知名奢侈品牌将制造AR眼镜

    Snapchat因为阅后即焚消息应用而被人所熟知,前段时间这家公司拓展主要业务,未来将不再只有消息应用,还有款名为"Spectacles"的AR太阳镜.内置了一个摄像头,戴上之后即 ...

  8. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1685  Solved: 751[Submit][Status] ...

  9. vijos P1780 【NOIP2012】 开车旅行

    描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...

随机推荐

  1. 判断是否英文字母或数字的C#正则表达式

    private int IsDigitOrNumber(string str) { if(System.Text.RegularExpressions.Regex.IsMatch(str,@" ...

  2. Linux NIO 系列(04-1) select

    目录 一.select 机制的优势 二.select API 介绍与使用 2.1 select 2.2 fd_set 集合操作 2.3 select 使用范例 三.深入理解 select 模型: 四. ...

  3. Sqlplus常用指令

    一.ORACLE的启动和关闭1.在单机环境下2.在双机环境下二.Oracle数据库有哪几种启动方式1.startup nomount 非安装启动,这种方式启动下可执行:重建控制文件.重建数据库2.st ...

  4. Vue-cli中的静态资源管理(src/assets和static/的区别)

    资源打包 为了回答这个问题,我们需要了解webpack是如何处理静态资源的.在所有的*.vue文件中你所有的templates 和CSS 都被vue-html-loader 和css-loader 查 ...

  5. sqlServer MERGE 对数据进行修改或插入自动视别 特别用于批量数据的插入或修改

    sqlServer MERGE   对数据进行修改或插入自动视别 特别用于批量数据的插入或修改    MERGE  customer AS targetTable   --目标表    USING ( ...

  6. MyBatis操作数据库(基本增删改查)

    一.准备所需工具(jar包和数据库驱动) 网上搜索下载就可以 二.新建一个Java project 1.将下载好的包导入项目中,build path 2.编写MyBatis配置文件:主要填写prope ...

  7. cmd登录mysql、查所有的库、查所有的表、查表下的所有字段

    一.设置好mysql的环境变量,cmd之后输入mysql -u root  -p 输入password进入mysql 二.展示所有的库名show  batabases: 三.选择一个库名use dem ...

  8. 2018-5-28-WPF-popup置顶

    title author date CreateTime categories WPF popup置顶 lindexi 2018-05-28 09:58:53 +0800 2018-2-13 17:2 ...

  9. 使mysql数据库支持简体中文

    永久支持简体中文[root@localhost ~]# vim /etc/my.cnf添加如下四行:[client]default-character-set=utf8 [mysql]default- ...

  10. [转]【Git】rebase 用法小结

    https://www.jianshu.com/p/4a8f4af4e803 本文主要参考 https://git-scm.com/docs/git-rebase rebase在git中是一个非常有魅 ...